Параллельная структура данных отношений - PullRequest
2 голосов
/ 26 октября 2010

Я не уверен, что термин для этой проблемы у меня, или если это вообще проблема, о которой нужно беспокоиться.скажем, у меня есть гипотетическая ситуация, подобная этой:

http://i.stack.imgur.com/o1zyq.png

кажется, что наличие ссылки от объектов ремикса обратно на исходные объекты создает несколько сложную структуру, особенно еслия начинаю добавлять больше объектов в структуру.

если я удаляю ссылки из песни ремикса и альбома ремикса на оригинал, я могу использовать какой-то идентификатор и пройти структуру, чтобы все еще выяснить оригинальные версии,но это потребовало бы от меня написания некоторого кода для обеспечения целостности данных, например, альбом ремиксов не указывает на оригинальный альбом, который больше не существует.

вопрос: есть такая структура, о которой нужно беспокоитьсяоколо?если да, то как исправить такую ​​структуру, кроме решения, которое я предложил выше, для которого требуется написание кода для обеспечения целостности данных.

1 Ответ

2 голосов
/ 26 октября 2010

Я не знаю, с каким языком программирования вы работаете, но мне кажется, что вы описываете направленный ациклический граф , который, в простых терминах, представляет собой набор точек сстрелки соединяют их, но циклов нет.

Это очень распространенная структура.Например, он описывает зависимости пакетов программного обеспечения в операционных системах с автоматической установкой программного обеспечения (например, во многих дистрибутивах 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);

Опять же, вам нужно найти способ защититься от циклов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...