Я не знаю, с каким языком программирования вы работаете, но мне кажется, что вы описываете направленный ациклический граф , который, в простых терминах, представляет собой набор точек сстрелки соединяют их, но циклов нет.
Это очень распространенная структура.Например, он описывает зависимости пакетов программного обеспечения в операционных системах с автоматической установкой программного обеспечения (например, во многих дистрибутивах Linux).Он описывает цитаты в научных статьях, где статья может ссылаться на множество других статей, а статья может цитироваться многими другими статьями, но для двух статей нет смысла ссылаться друг на друга.
Лучший способпредставление этой структуры данных зависит от языка программирования и от того, что вам нужно с ним делать.Самый простой способ сделать это в большинстве языков программирования - просто связать каждый объект с другими объектами по ссылке, например:
struct Song {
std::string name;
std::vector<struct Foo*> originals;
};
Найти каждый «оригинал» данной песни очень просто., но каждый «ремикс» обходится дороже.Вы можете дополнить структуру ссылками ремиксов и обеспечить согласованность, но в обоих случаях вы должны убедиться, что циклов нет.
В базе данных SQL вы можете описать отношения следующим образом:
CREATE TABLE songs (
id SERIAL PRIMARY KEY,
name TEXT
);
CREATE TABLE is_remix_of (
remix INT REFERENCES songs(id),
original INT REFERENCES songs(id)
);
CREATE INDEX remix_to_original ON is_remix_of(remix);
CREATE INDEX original_to_remix ON is_remix_of(original);
Опять же, вам нужно найти способ защититься от циклов.