我正在尝试在PostgreSQL数据库中存储依赖关系树。大约有20,000个软件项目,每个项目可以依赖于其他几个项目。
有几种类型的依赖项(一些是运行时依赖项,一些是构建时依赖项,一些是测试依赖项)。
依赖项是递归的,每个项目只知道它立即依赖的东西。
我需要列出项目的所有依赖项,并将它们显示为树和展平列表。我还需要回答“取决于这个项目的原因?”
建议使用哪种方法来存储此信息以便提取相对简单的内容?
答案 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。