Database design 数据库模型父级-子级与单个默认子级。

Database design 数据库模型父级-子级与单个默认子级。,database-design,parent-child,Database Design,Parent Child,是否有一个最佳实践模式来模拟以下父子关系,其中只有一个子关系可以标记为默认子关系 我可以想出两种方法。哪一个更好,还是有其他更好的替代方案 - ParentTable - Id - ChildTable - Id - ParentId - IsDefault 或 一般来说,第二个更好,因为它更容易确保只有一个孩子是默认的孩子 SQL也稍微清晰一些 比较 SELECT * FROM parenttable p I

是否有一个最佳实践模式来模拟以下父子关系,其中只有一个子关系可以标记为默认子关系

我可以想出两种方法。哪一个更好,还是有其他更好的替代方案

   - ParentTable
      - Id

   - ChildTable
      - Id
      - ParentId
      - IsDefault



一般来说,第二个更好,因为它更容易确保只有一个孩子是默认的孩子

SQL也稍微清晰一些

比较

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


我喜欢完全防止无效数据存在的数据模型。如果使用第二种方法并在DefaultChildId和ChildTable之间创建外键关系,则可以添加约束以确保数据库永远不会处于无效状态——如果尝试删除某个人的默认子级,则数据库将阻止您。使用第一种方法,它不会


具体来说(如注释中所述),应该对DefaultChildId使用ON DELETE RESTRICT约束,对ParentID使用DELETE CASCADE约束。这样可以更灵活地创建记录(您不需要已有默认子项才能创建父项),防止在不首先更新为新默认项的情况下意外删除默认子项,并智能地处理父项的删除。

不能使用NOT NULL,因为它会导致鸡或蛋问题。应在DefaultChildId和ParentId上的DELETE CASCADE上使用ON DELETE RESTRICT约束,以最终允许删除父项。请更新投票。
SELECT * 
FROM   parenttable p 
       INNER JOIN childtable c 
         ON p.id = c.parentid 
            AND c.isdefault = 1 
SELECT * 
 FROM   parenttable p 
     INNER JOIN childtable c 
       ON p.defaultchildid = c.id