我想在PostgreSQL数据库中存储依赖关系树。有大约20,000个软件项目,每个项目可以依赖于其他几个项目。如何在数据库中存储依赖关系树?
有几种类型的依赖关系(一些是运行时依赖项,一些是构建时依赖项,一些是测试依赖项)。
依赖关系是递归的,每个项目只知道它立即依赖的东西。
我需要列出一个项目的所有依赖关系,并将它们显示为一个树和一个展开列表。我还需要回答“依赖于这个项目的东西?”
什么是推荐的方式来存储这些信息,使获取相对容易?
我想在PostgreSQL数据库中存储依赖关系树。有大约20,000个软件项目,每个项目可以依赖于其他几个项目。如何在数据库中存储依赖关系树?
有几种类型的依赖关系(一些是运行时依赖项,一些是构建时依赖项,一些是测试依赖项)。
依赖关系是递归的,每个项目只知道它立即依赖的东西。
我需要列出一个项目的所有依赖关系,并将它们显示为一个树和一个展开列表。我还需要回答“依赖于这个项目的东西?”
什么是推荐的方式来存储这些信息,使获取相对容易?
我会实现一个简单的多对多自动关系。
事情是这样的:
Software Dependency
+------------+ +-----------------------+
| SoftwareId | | SoftwareId |
+------------+ /| DependsUponSoftwareId |
| Name |--------|-+-----------------------+
| ... | \| ... |
+------------+ +-----------------------+
我会用一个ORM,构建内存中的对象图,然后让ORM坚持它:P。
你有没有考虑过这种构造的性能问题?如何建模类,为什么你没有给出例子? – WildWezyr
我认为你的评论是无用的,相反,我已经给了思考至少,我不知道举例始终是必须的。如果你不知道如何坚持图表,那么我真的很抱歉。如果你不知道如何建模树,那么打开另一个问题。如果这些是你的问题,那么你不应该评论。 –
这可能是值得拿起Joe Celko的“树木和层次结构在SQL智能”的副本。它有对这种事情可用的不同选项的解释和例子。
我会说它*绝对值得这本书。如果你正在实施树木,那么值得一读。期。 –
我会在一些数据存储像
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添加到数组中,并在最后将其取出。
不错的ascii艺术;-)但它显示一对多,而不是多对多。 – WildWezyr
设计还需要从Dependency.DependsUponSoftwareId到Software.SoftwareId的一对一关系,以确保它们仅依赖于现有行。 – Tony