数据库模型具有单个默认子项的父子项。

时间:2012-02-08 20:49:09

标签: database-design parent-child

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

我可以想到两种方式。哪个更好还是有另一个更好的替代品?

   - ParentTable
      - Id

   - ChildTable
      - Id
      - ParentId
      - IsDefault

   - ParentTable
      - Id
      - DefaultChildId

   - ChildTable
      - Id
      - ParentId

2 个答案:

答案 0 :(得分:2)

我赞成防止无效数据存在的数据模型。如果您使用第二种方法并在DefaultChildId和ChildTable之间创建外键关系,那么您可以添加约束以确保您的数据库不会处于无效状态 - 如果您尝试删除一个孩子,是某人的默认子,数据库会阻止你。使用第一种方法,它不会。

具体而言(如注释中所述),应在ParentID上的DefaultChildId和ON DELETE CASCADE上使用ON DELETE RESTRICT约束。这允许创建具有更大灵活性的记录(您不需要已经存在可以创建父项的默认子项),防止在没有首先更新到新默认值的情况下意外删除默认子项,并且智能地处理删除父节点。

答案 1 :(得分: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