2009-04-08 17 views
3

本質上,我希望用戶能夠定義分層模型,但是接下來我需要允許用戶將數據存儲在其定義的模型中。這有意義嗎?因此,用戶將能夠創建新的「單元類型」以分層方式組織,並決​​定如何組織這些類型的單元。一個簡單的例子:在我的假設界面中,用戶創建三種單位類型,樹幹,分支和葉子。用戶然後定義它們之間的關係。葉子可以存在於層次結構中的任何點,分支必須具有樹幹作爲父級。然後用戶可以創建這些單位類型的實例(作爲單位),並可以按照他們的模型中定義的規則來組織它們......在數據庫中這樣做的好方法是什麼?在數據庫中建模用戶定義的層次關係的最佳方法是什麼?

回答

3

這是一個非常寬泛的問題,但這可能會指向正確的方向。請注意,您只能將關係規則存儲在數據庫中。執行它們將取決於您的客戶端代碼。試試這個關於大小..

unit: 
    unit id, 
    name, 

unit relationship: 
    unit id, 
    foreign unit id 

然後,您可以使用您的單位關係表通過以下方式..

unit id涉及到它描述的單元。 foreign unit id應該是空的。

A unit沒有關係記錄只能存在於heirarchy的根部。 A unitnullforeign unit id可以有任何其他unit作爲其父母。否則,unit必須有另一個unit作爲其父項,並且它的類型必須是其關係記錄中定義的那一個。

至於存儲實例本身,這應該是簡單..

instance: 
    instance id, 
    unit id, 
    parent instance_id 

我肯定會有其他領域你需要(名稱,例如),但我相信你得到的漂移。

+0

這是什麼被稱爲「鄰接列表」? – ninesided 2009-04-08 02:03:58

2

您需要實現三個概念:

  • 「單位類型」和他們的允許協會
  • 層次
  • 實際單位

這些概念可以共存或多或少在模型中獨立,但一起工作。

create table unittype 
(
    id int; 
    name varchar(20); 
) 

create table unitrelationship 
(
    id int; 
    parent_id int; 
) 

你可以模擬層次的自我引用表:

create table hierarchy 
(
    id int; 
    parent_id int; 
    unit_type_id int; 
    unit_id int; 
) 

然後,您可以在一個或多個表的單元實例,並與他們做你所描述的。

create table unit 
{ 
    id int; 
    .... 
} 

好消息是,你只限制在允許父類型,它可以在用戶界面中從允許類型的所有現有設備的列表選擇父容易執行,例如。

1

雖然我需要支持多個層次結構(一個子集,多個層次結構視圖),但我正在處理類似的問題。我發現Joe Celko的「智能化SQL中的樹和層次結構」(ISBN:1558609202)很有用。我仍然在研究這個問題,但是在討論這個話題時經常提到它似乎很適合提及。

相關問題