2016-01-21 279 views
-1

我正在尋找一種有效的方法來構建可處理以下情形的數據庫模型: 模型需要處理未定義深度的層次結構,其中每個節點可以有0到3(最多)每個孩子可以是5-7種不同類型的孩子。多態層次結構DB設計

以下是我需要支持的示例樹,其中'foo','bar'等每個都將在不同的表中輸入,並且數字引用該表中的id。假設foo.1,bar.2和foo.3是頂級節點。 Base對於我來說只是一個虛擬對象,指向未知類型的頂級節點。

Base.1 
|-foo.1 
    |-foo.2 
    |-qaz.1 
    |-bar.1 
Base.2 
|-bar.2 
    |-qaz.2 
    |-foo.2 
    |-bar.3 
Base.3 
|-foo.3 

此外,兒童的順序必須被保持(即,它是不正常在上述的層次結構與foo.2切換qaz.2)。

從數據訪問的角度來看,大多數時候我將檢索從頂級對象(Base.x)繼承的整個樹。

的人認爲我已經到目前爲止定義具有多態關聯的表和每個子節點類型的引用中央表,如:

BaseTable 
--------- 
BaseId (PK) 
ObjectId (FK) 

ObjectTable 
----------- 
ObjectId (PK) 
ObjectType 
OtherTableId 
BaseId (FK) gets top level parent 

FooTable 
--------- 
FooId (PK) 
Child1_ObjectId (FK) 
Child2_ObjectId (FK) 
Child3_ObjectID (FK) 
Other data fields... 

etc. for bar and qaz 

我的想法是,我可以用ObjectTable中的BaseID FK來抓取整個樹,但是有沒有一種通過SQL重建整個樹的有效方法,還是需要在檢索後在我的代碼中執行該操作?或者,是否有更好的方式以更高效的方式存儲這類數據並保證關係完整性?

回答

0

將是一個不同的表

是否有一個很好的理由進入?

單表繼承是最快的,所以如果性能是您的關心......

這將工作:

create table foo (
    foo_id int primary key, 
    type char(1) not null, 
    parent_id int null references foo(foo_id), 
    display_order int not null default 0, 
    foo_specific_data..., 
    bar_specific_data..., 
    qux_specific_data..., 

    unique(parent_id, display_order) 
); 

然後使用recursive common table expressions查詢(避免的MySQL/MaridDB)。使用觸發器強制執行「最多3個子女」規則/顯示訂單更新