【问题标题】:How to store dependency tree in a database?如何在数据库中存储依赖树?
【发布时间】:2011-01-06 08:07:13
【问题描述】:

我正在尝试将依赖关系树存储在 PostgreSQL 数据库中。大约有 20,000 个软件项,每个项可以依赖于其他几个项。

有几种类型的依赖项(一些是运行时依赖项,一些是构建时依赖项,一些是测试依赖项)。

依赖是递归的,每个项目只知道它直接依赖的东西。

我需要列出一个项目的所有依赖项,并将它们显示为树和扁平列表。我还需要回答“这取决于什么?”

有什么推荐的方法来存储这些信息以使获取相对容易?

【问题讨论】:

    标签: sql database database-design postgresql dependencies


    【解决方案1】:

    可能值得一读 Joe Celko 的“Smarties 中的树和层次结构”。它对此类事情可用的不同选项进行了解释和示例。

    【讨论】:

    • 我会说绝对值得买这本书。如果您正在实现树,那么值得一读。期间。
    【解决方案2】:

    我会将数据存储在类似的东西中

    CREATE TABLE software (
       id SERIAL PRIMARY KEY,
       ...
    );
    
    CREATE TABLE software_dependency (
       dependent int NOT NULL REFERENCES software(id),
       dependee int NOT NULL REFERENCES software(id),
       deptype int, -- or whatever you want
       CONSTRAINT pk_software_dependency PRIMARY KEY  (dependent, dependee)
    );
    

    您将能够获得所有依赖项的列表,例如:

    WITH RECURSIVE t(id,type) AS (
     SELECT dependee,deptype FROM software_dependency WHERE dependent=3
    UNION ALL
     SELECT d.dependee,deptype FROM software_dependency d INNER JOIN t ON t.id=d.dependent
    )
    SELECT * FROM t;
    

    编辑:要获得一棵树,一个好方法是以 ARRAY 格式累积依赖关系。对于递归中的每一步,使用数组附加运算符 (||) 将新 ID 添加到数组中,并在最后取出。

    【讨论】:

    • dependent=3 表示您将获得software(id)id=3 的所有依赖项?
    【解决方案3】:

    我会实现一个简单的多对多自动关系。

    类似这样的:

     Software                Dependency
    +------------+          +-----------------------+
    | SoftwareId |          | SoftwareId            |
    +------------+         /| DependsUponSoftwareId |
    | Name       |--------|-+-----------------------+
    | ...        |         \| ...                   |
    +------------+          +-----------------------+ 
    

    【讨论】:

    • 不错的 ascii-art ;-) 但它显示的是一对多而不是多对多。
    • 该设计还需要从 Dependency.DependsUponSoftwareId 到 Software.SoftwareId 的一对一关系,以确保它们仅依赖于现有行。
    【解决方案4】:

    我会使用 ORM,在内存中构造对象图,然后让 ORM 持久化它:P。

    【讨论】:

    • 您是否考虑过这种结构的性能问题?如何建模类,为什么你没有给出例子?
    • 我认为您的评论毫无用处,相反,我至少已经深思熟虑了,我不知道提供示例始终是-必须的方式。如果您不知道如何保留图表,那么我真的很抱歉。如果您不知道如何为树建模,请打开另一个问题。如果这些对您来说是问题,那么您根本不应该发表评论。
    猜你喜欢
    • 2014-09-12
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多