我想在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