假设您有一个表订单,其中包含客户ID的外键.现在,假设你想添加一个没有客户ID的订单,(这是否可能是另一个问题)你必须使外键为NULL ...这是不好的做法还是你宁愿使用链接表订单和客户?虽然关系是1到n,但是链接表会使n到n.另一方面,通过链接表,我不再拥有那些NULLS ......
数据库中实际上不会有很多NULL,因为具有NULL的外键的记录只是临时的,直到添加了订单的客户.
(在我看来,它不是订单和客户).
编辑:未分配的客户链接到什么?
Cha*_*ana 106
否Nullable FKs没有任何问题.当FK指向的实体与主键引用表处于(零或一)到(1或多)关系时,这是常见的.
例如,如果表中同时具有物理地址和邮件地址属性(列),则FK为地址表.当实体只有邮局信箱(邮寄地址)时,您可以使物理地址可以自由处理,邮件地址与邮件地址相同(或不符号)时邮件地址可以自由处理.
Pat*_*gne 48
拥有链接表可能是一个更好的选择.至少它不违反正常化BCNF(博伊斯 - 科德正常形式).但我赞成务实.如果你只有很少的这些空值而且它们只是暂时的,我认为你应该跳过链接表,因为它只会增加方案的复杂性.
旁注; 如果你在链接表中使用指向你的订单表的外键作为该链接表中的主键,那么使用链接表并不一定会使它成为n到n,关系仍然是1..n.每个订单的链接表中只能有一个条目.
Erw*_*out 35
根据我所读的内容,可空列可以是1NF到5NF,但不是6NF.
只有你比Chris Date更了解"第一个正常形式的真正含义".如果x和y都可以为空,并且实际上在某些行中x和y都是可空的null
,则WHERE x=y
不会产生true
.这无可置疑地证明null不是一个值(因为任何实际值总是等于它自己).由于RM规定"表格的每个单元格中都必须有值",任何可能包含空值的东西都不是关系型的东西,因此1NF的问题甚至不会出现.
我听说它认为Nullable列通常会打破第一级标准化.
请参阅上文,了解该论点背后的合理原因.
但在实践中它非常实用.
只有当你对世界其他地方通常会引起的头痛免疫时,一个这样的头痛(它只是一个小问题,相对于其他null
现象)是事实,WHERE x=y
在SQL实际意味着WHERE x is not null and y is not null and x=y
,但大多数程序员根本不知道这个事实,只是阅读它.有时没有任何伤害,有时则没有.
事实上,可空列违反了最基本的数据库设计规则之一:不要在一列中组合不同的信息元素.Null正是这样做的,因为它们将布尔值"this field is/is not really present"与实际值组合在一起.
ped*_*rce 13
我看不出有任何错误,它只是一个可选的n-1关系,将在外键中用null表示.否则,如果您放置链接表,那么您将必须管理它不会成为一种关系,因此会造成更多麻烦.
可选关系在关系模型中绝对是可能的。
您可以使用 null 来表示不存在关系。它们很方便,但它们也会给您带来与 null 给您在其他地方带来的同样的头痛。它们不会造成任何麻烦的一个地方是连接。外键中包含 null 的行与引用表中的任何行都不匹配。所以他们退出了内部连接。如果你进行外连接,你无论如何都会处理空值。
如果你确实想避免空值(第六范式),你可以分解表。两个分解表之一有两个外键列。一个是您拥有的可选外键,另一个是引用原始表主键的外键。现在您必须使用约束来防止关系变成多对多,如果您想防止这种情况发生。