数据库模型父子具有单个默认子级。
问题描述:
是否有一个最佳实践模式来模拟以下父亲子女关系,其中只有一个子女可以被标记为默认子女。数据库模型父子具有单个默认子级。
我可以想到两种方法。哪个更好,还是有更好的替代品?
- ParentTable
- Id
- ChildTable
- Id
- ParentId
- IsDefault
或
- ParentTable
- Id
- DefaultChildId
- ChildTable
- Id
- ParentId
答
我喜欢的是防止现有的所有无效数据的数据模型。如果您使用第二种方法并在DefaultChildId和ChildTable之间创建外键关系,那么您可以添加约束来确保您的数据库不会处于无效状态 - 如果您尝试删除一个孩子是某人的默认孩子,数据库将阻止你。使用第一种方法,它不会。
具体而言(如注释中所述),应在DefaultChildId上使用ON DELETE RESTRICT约束,并在ParentID上使用ON DELETE CASCADE。这允许创建具有更大灵活性的记录(您不需要有一个默认孩子可以创建父母),防止在不首先更新为新的默认情况下意外删除默认孩子,并智能地处理删除家长。
答
一般来说,第二个是更好,因为它更容易确保有且仅有一个孩子是默认的孩子。
的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
+1防止删除默认孩子的好处。 – 2012-02-08 20:56:31
你不能使用NOT NULL,因为它会导致鸡或鸡蛋问题。 ON DELETE RESTRICT约束应该在DefaultChildId上使用,并且在ParentId上使用ON DELETE CASCADE来最终允许删除父项。请更新投票。 – gertas 2012-07-03 19:37:33
好点,@gertas。我已更新。 – 2012-07-03 20:30:31