sql - 排除 Material list 样式关系中的空值

标签 sql database referential-integrity

给定模式

PERSON { name, spouse }

其中 PERSON.spouse 是 PERSON.name 的外键,当一个人未婚或我们没有任何信息时,NULL 是必需的。

关于反对 null 的论点,在这种情况下您如何避免它们?

我有一个替代方案

PERSON { name }
SPOUSE { name1, name2 }

其中 SPOUSE.name* 是对 PERSON 的 FK。我在这里看到的问题是,没有办法确保某人只有一个配偶(即使有所有可能的 UNIQUE 约束,也有可能有两个配偶)。

在 Material list 样式关系中排除空值的最佳方法是什么?

最佳答案

我认为对于这种类型的关系强制不使用 NULL 和不重复会使模式定义比实际需要的更复杂。即使您允许空值,一个人仍然有可能拥有多个配偶,或者有相互冲突的记录,例如:

PERSON { A, B }
PERSON { B, C }
PERSON { C, NULL }

您需要引入更多数据,例如性别(或同性婚姻的“配偶数”?)以确保仅允许一种类型的人拥有配偶。另一人的配偶将由第一人的记录决定。例如:

PERSON { A, FEMALE, B }
PERSON { B, MALE, NULL }
PERSON { C, FEMALE, NULL }

... 因此只有女性才能拥有非空 SPOUSE。

但是恕我直言,即使使用 NULL,这也过于复杂且不直观。如果没有 NULL,情况会更糟。除非您真的别无选择,否则我会避免进行这样的模式限制。

关于sql - 排除 Material list 样式关系中的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/368725/

相关文章:

database - 我应该通过数据库错误来执行业务逻辑吗?

sql - 创建链接到另外 2 个表的表的聚合查询

mysql - 关于pair-remove重复的Sql查询

mysql - DB2 使用日期和时间显示用户的最新行记录

.net - 如何有效管理数据库 : using direct sql commands or DataSets?

database - 在 Access 2010 中创建具有引用完整性的关系时出现“索引过多”错误

sql - 使用 SQL Server Express 进行 SQL Server Standard 开发?

mysql - sql-server 到 mysql 的翻译

c# - get 访问器中的异步调用 - 这是好习惯吗?

mysql - 在尝试删除 MySQL 中的任何这些记录之前,如何检查记录列表的外键引用?