【发布时间】:2011-08-06 08:09:34
【问题描述】:
我有一个关于在数据库中为外键列使用空值与默认值的问题。在设计数据库时,我发现很多关于 null 与默认值的相反意见,但并不完全适用于外键(主要优点和缺点是什么)。
目前我正在设计一个新的数据库,它将为不同的 Web 应用程序和具有不同数据访问方法(ORM、存储过程)的其他系统存储大量数据,并且我想在最低级别实现一般规则(数据库)。 (所以以后在应用程序中不必担心这些规则)。
举个例子,假设我有一个用户表User,外键列是他的国籍NationalityID,这是表CountryID的主键Country。
现在我有两个/三个选项:
A:我允许NationalityID 列(以及数据库中所有其他类似的外键列)为空,并且只坚持始终检查空值的常用方法(在应用程序中应用规则)
或
B:我为每个外键分配了一个默认值,比如说“-1”,并在每个关系表的附加列中放入“-1”作为键,所有其他数据作为“无数据”(为此例如在Country 表中,我放置了 CountryID 为“-1”的列,对于CountryName,我设置了“无数据”)。所以每次我想知道用户的国籍时,我总是会在没有额外代码规则的情况下得到结果(我不需要检查它是否为空)。
或
C:我可以禁止外键为空值。但这确实是我想要避免的。 (如果不是附加数据(用户国籍),我需要至少存储基本数据(用户名)的选项)
那么 B 是不是好方法?我在这里想念什么?通过这种方法,我会失去更多吗?我可能会遇到哪些问题(除了要小心在关系表中始终有附加列,ID 值为“-1”,表示“没有数据”)?
您对外键默认值的好/坏体验是什么?
谢谢
【问题讨论】:
标签: sql-server nhibernate database-design foreign-keys default-value