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

问题描述:

是否有一个最佳实践模式来模拟以下父亲子女关系,其中只有一个子女可以被标记为默认子女。数据库模型父子具有单个默认子级。

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

- ParentTable 
     - Id 

    - ChildTable 
     - Id 
     - ParentId 
     - IsDefault 

- ParentTable 
     - Id 
     - DefaultChildId 

    - ChildTable 
     - Id 
     - ParentId 

我喜欢的是防止现有的所有无效数据的数据模型。如果您使用第二种方法并在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

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

的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