我正在嘗試繪制資料庫模式并努力解決繼承問題。讓我用一個例子來說明:
我有桌子List和Item:
Table List{
id varchar [not null, pk]
parent_list_id varchar [ref: - List.id]
}
Table Item{
id varchar [not null, pk]
list_id varchar [ref: > List.id]
}
Table Rule{
id varchar [not null, pk]
list_id varchar [ref: > List.id]
item_id varchar [ref: > Item.id]
}
可以有多個串列,它們Rule從上層繼承它們的 s List。AList可以有多個Items 和多個Rules,屬于一個 List 的所有 List 和 Item 都應該從父 List 繼承它們的規則。子串列和專案也可以設定自己的規則,如果是串列,規則將繼承到它們的子串列。
一個例子:
- 串列_A
- Rule_A(專門設定為 List_A)
- Rule_B(專門設定為 List_A)
- 串列_B
- Rule_A(繼承)
- 規則_B(繼承)
- Rule_C(專門設定為 List_B)
- 專案_A
- Rule_A(繼承)
- 規則_B(繼承)
- Rule_C(繼承)
- Rule_D(專門設定為 Item_A)
現在,這應該不是什么大問題,但我還需要能夠將規則設定為活動或非活動。active我考慮為我的模型設定一個布林值,Rule但我認為這種方法存在問題。如果我想設定Rule_A和Rule_B不活動(它們在andItem_A下仍然是活動的),這是一個問題,因為我的規則將參考. 如果有人對如何處理這種繼承提出一些建議,我將非常感激,我有點卡在這里。List_AList_Blist_idList_A
uj5u.com熱心網友回復:
您在這里所擁有的是,用物體-關系術語解釋您的描述:
- 單個專案(或串列)可以有多個與之相關的規則。
- 一個規則可以有多個與之相關的專案(或串列)。
- (繼承方面超出了這個模型,imo,基本上是“創建副本時的預填充規則 - 項關系”,如果這有意義的話)。
這是一個經典的多對多案例。以及使用聯結表處理這種關系的最明顯方法。這些很酷的是,您可以在聯結表中擁有一些額外的欄位來保存一些額外的屬性。例如enabled boolean:
Table List {
id varchar [not null, pk]
parent_list_id varchar [ref: - List.id]
}
Table Item {
id varchar [not null, pk]
list_id varchar [ref: > List.id]
}
Table Rule {
id varchar [not null, pk]
}
Table rule_to_list {
-- composite PK (list_id, rule_id)
list_id varchar [ref: > List.id]
rule_id varchar [ref: > Rule.id]
enabled boolean
}
Table rule_to_item {
-- composite PK (item_id, rule_id)
item_id varchar [ref: > Item.id]
rule_id varchar [ref: > Rule.id]
enabled boolean
}
使用此模式,您將能夠輕松啟用/禁用與特定串列/專案相關的單個規則,甚至在需要時完全洗掉它們。
您唯一需要實作的是將父項/串列規則復制到聯結表,但這很容易。或者您可以使用隱式“所有專案/串列從其父項繼承規則,除非有覆寫”(即父串列啟用了規則 A,而子串列在聯結表中明確禁用了 A)并在計算時向上遍歷層次結構專案/串列的規則串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/453141.html
標籤:数据库 PostgreSQL 遗产 数据库设计 关系型数据库
