【问题标题】:Parallel relationship data structure平行关系数据结构
【发布时间】:2011-04-30 11:59:31
【问题描述】:

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

似乎从重新混合对象到原始对象的链接会导致结构有些复杂,尤其是当我开始向结构中添加更多对象时。

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

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

【问题讨论】:

    标签: data-structures


    【解决方案1】:

    我不知道您使用的是哪种编程语言,但在我看来,您在描述 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);
    

    同样,您必须找到一种方法来防止循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-10
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2010-10-10
      • 2013-08-21
      相关资源
      最近更新 更多