2010-10-25 69 views
2

我不确定我遇到的这个问题的术语,或者如果它甚至是一个需要担心的问题。比方说,我有一个假设的情况是这样的:并行关系数据结构

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

它好像有从重新混音的链接对象回到原始对象使一个比较复杂的结构,尤其是当我开始添加更多对象进入结构。

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

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

回答

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); 

再次,你必须找到一个方法来防范周期。