【发布时间】:2018-08-11 23:47:27
【问题描述】:
我正在寻找如何(最好)为关系数据库建模,以便它可以标记 1:n 关系中的(0 或 1)个条目是首选的。
(它实际上是在 mariadb 10.2 中实现的,但这并不重要)
为简单起见,假设我有两个表:
父母:
- 身份证
- 姓名
孩子:
- 身份证
- 姓名
- parentid (FK -> parent(id) )
问题是我需要建模一种存储首选子项的方法
我看到了两种方法,但我不太喜欢任何一种:
- 在父项中添加一个字段,列出首选子项的 id,并将其作为子项的 FK。
- 在子项中添加一个布尔列以指示一行是首选子项。
我看到的东西:
只有 1 个首选孩子:
在解决方案 1 的情况下,我只能有一个最大值。一个首选的孩子(=好)
在解决方案 2 的情况下,我需要依靠应用程序为每个父母只指定一个首选孩子 (=bad)
-> 这将我推向解决方案 1
可维护性
解决方案 1 在父表和子表之间的双向创建 FK。我不相信这样的结构如何能够持续下去,例如如果需要备份/恢复周期,因为没有更多的创建表的顺序,它们需要在没有 FK 的情况下创建,然后需要稍后添加。即使这些都被工具所覆盖,我仍然很害怕长期可维护性。
-> 这将我推向解决方案 2
所以在我们选择一个解决方案之前,我不相信这两个都不是一个好的解决方案,有人有其他解决方案需要考虑吗?
还有什么我忽略的要考虑的吗?
我不确定如何考虑标准化。
编辑:
在键入此内容后进一步挖掘,我想出了第三个看起来更好的选项:添加第三个表来为首选子级建模。
基本上:
首选孩子:
- 父代
- childid
全部带有 FK,例如
FOREIGN KEY (parentid, childid) REFERENCES child (parentid, id)
可能还有一些更独特的键来确保它是唯一的,但这解决了我上述解决方案 1 的鸡蛋问题,并避免了应用程序在解决方案 2 中可能造成的混乱。
在这第三个选项中,我做了一个快速的处理:http://sqlfiddle.com/#!9/af77bf/5/0
【问题讨论】:
标签: database-design foreign-keys database-normalization