是否有最佳实践模式来模拟以下父子关系,其中只有一个孩子可以被标记为默认子项。
我可以想到两种方式。哪个更好还是有另一个更好的替代品?
- ParentTable
- Id
- ChildTable
- Id
- ParentId
- IsDefault
或
- ParentTable
- Id
- DefaultChildId
- ChildTable
- Id
- ParentId
答案 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