2010-01-18 41 views
3

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

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

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

我需要列出一个项目的所有依赖关系,并将它们显示为一个树和一个展开列表。我还需要回答“依赖于这个项目的东西?”

什么是推荐的方式来存储这些信息,使获取相对容易?

回答

0

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

事情是这样的:

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

不错的ascii艺术;-)但它显示一对多,而不是多对多。 – WildWezyr

+0

设计还需要从Dependency.DependsUponSoftwareId到Software.SoftwareId的一对一关系,以确保它们仅依赖于现有行。 – Tony

-3

我会用一个ORM,构建内存中的对象图,然后让ORM坚持它:P。

+0

你有没有考虑过这种构造的性能问题?如何建模类,为什么你没有给出例子? – WildWezyr

+0

我认为你的评论是无用的,相反,我已经给了思考至少,我不知道举例始终是必须的。如果你不知道如何坚持图表,那么我真的很抱歉。如果你不知道如何建模树,那么打开另一个问题。如果这些是你的问题,那么你不应该评论。 –

2

这可能是值得拿起Joe Celko的“树木和层次结构在SQL智能”的副本。它有对这种事情可用的不同选项的解释和例子。

+0

我会说它*绝对值得这本书。如果你正在实施树木,那么值得一读。期。 –

0

我会在一些数据存储像

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

相关问题