2010-01-18 67 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添加到數組中,並在最後將其取出。

相關問題