并行关系数据结构

时间:2010-10-25 23:26:54

标签: data-structures

我不确定我遇到的这个问题的术语,或者甚至是一个担心的问题。假设我有一个这样的假设情况:

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

似乎从重新混合对象到原始对象的链接使得结构有点复杂,特别是如果我开始在结构中添加更多对象。

如果我从混音歌曲和混音专辑删除链接到原版,我可以使用某种ID并遍历结构仍然可以找出原始版本,但这需要我写一些代码以确保完整性数据,如重新混音专辑并未指向不再存在的原始专辑。

问题:有这样的结构需要担心吗?如果是这样,除了上面提出的解决方案之外,如何修复这样的结构,这需要编写代码以确保数据的完整性。

1 个答案:

答案 0 :(得分:2)

我不知道你正在使用什么编程语言,但它看起来像你在描述一个directed acyclic graph,简单来说,它是带有箭头连接点的集合,但是没有任何循环。

这是一种非常常见的结构。例如,它描述了使用自动化软件安装(例如许多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);

同样,你必须找到一种防范周期的方法。