如何在数据库中存储依赖树?

时间:2010-01-18 11:33:09

标签: sql database database-design postgresql dependencies

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

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

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

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

建议使用哪种方法来存储此信息以便提取相对简单的内容?

4 个答案:

答案 0 :(得分:2)

值得一提的是Joe Celko的“树和层次结构在SQL中的聪明人”。它有一个解释和例子,可用于此类事情。

答案 1 :(得分:1)

我将数据存储在

之类的内容中
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添加到数组中,并在最后将其取出。

答案 2 :(得分:0)

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

这样的事情:

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

答案 3 :(得分:-3)

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