2012-02-08 71 views
1

是否有一個最佳實踐模式來模擬以下父親子女關係,其中只有一個子女可以被標記爲默認子女。數據庫模型父子具有單個默認子級。

我可以想到兩種方法。哪個更好,還是有更好的替代品?

- ParentTable 
     - Id 

    - ChildTable 
     - Id 
     - ParentId 
     - IsDefault 

- ParentTable 
     - Id 
     - DefaultChildId 

    - ChildTable 
     - Id 
     - ParentId 

回答

2

我喜歡的是防止現有的所有無效數據的數據模型。如果您使用第二種方法並在DefaultChildId和ChildTable之間創建外鍵關係,那麼您可以添加約束來確保您的數據庫不會處於無效狀態 - 如果您嘗試刪除一個孩子是某人的默認孩子,數據庫將阻止你。使用第一種方法,它不會。

具體而言(如註釋中所述),應在DefaultChildId上使用ON DELETE RESTRICT約束,並在ParentID上使用ON DELETE CASCADE。這允許創建具有更大靈活性的記錄(您不需要有一個默認孩子可以創建父母),防止在不首先更新爲新的默認情況下意外刪除默認孩子,並智能地處理刪除家長。

+0

+1防止刪除默認孩子的好處。 – 2012-02-08 20:56:31

+0

你不能使用NOT NULL,因爲它會導致雞或雞蛋問題。 ON DELETE RESTRICT約束應該在DefaultChildId上使用,並且在ParentId上使用ON DELETE CASCADE來最終允許刪除父項。請更新投票。 – gertas 2012-07-03 19:37:33

+0

好點,@gertas。我已更新。 – 2012-07-03 20:30:31

0

一般來說,第二個是更好,因爲它更容易確保有且僅有一個孩子是默認的孩子。

的SQL也是一個稍微清晰的

比較

SELECT * 
FROM parenttable p 
     INNER JOIN childtable c 
     ON p.id = c.parentid 
      AND c.isdefault = 1 

VS

SELECT * 
FROM parenttable p 
    INNER JOIN childtable c 
     ON p.defaultchildid = c.id 
相關問題