可空的外键坏习惯?

Lie*_*oen 111 database-design

假设您有一个表订单,其中包含客户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.每个订单的链接表中只能有一个条目.

  • 我有兴趣听到一个链接表更好的情况,我从来没有遇到过以任何方式改进流程的情况. (5认同)
  • 正如我在回答中指出的那样,在这种特定情况下我会务实,而不是使用链接表.我确信正常形式不是为了改善流程而发明的,而是为了确保一致性并避免冗余.这是一个非常笼统的讨论,我认为必须根据具体情况进行讨论. (4认同)
  • source__destination_link或SourceDestination (2认同)

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"与实际值组合在一起.

  • "WHERE x不为空且y不为空且x = y"的+1.没有意识到这一点. (15认同)
  • 一个问题。当值“不存在”(这是真实场景)并且数据库属性不允许为空时,属性中的任何值都是错误的。至于令人头疼的问题,请记住,KISS,这不仅仅意味着保持简单,还意味着保持尽可能简单,但不能更简单。如果“关系模型”需要一个不切实际的、愚蠢的结果,那么也许规则需要扩展以处理必要的现实世界数据? (2认同)
  • Chris Date,《逻辑与数据库》,第6章,“为什么关系DBMS逻辑一定不能被多值”,第145页。该章的引用列表也应该很有趣,尤其是涉及McGoveran的引用列表。 (2认同)
  • @Jay 没有人关心你的生活是否变得“更加困难”。你的工作是担心你的用户的生活有多困难,而不是你自己的生活。如果你做事的角度/目的是让_你自己_的生活“不那么困难”,你可以打赌,一些复杂性不会在它们应该解决的地方得到解决,最终使_最终用户的_生活“更加困难” ”。复杂性总是在某个地方。 (2认同)

ped*_*rce 13

我看不出有任何错误,它只是一个可选的n-1关系,将在外键中用null表示.否则,如果您放置链接表,那么您将必须管理它不会成为一种关系,因此会造成更多麻烦.

  • 管理?它是0对1方面的简单UNIQUE约束! (4认同)
  • 实际上它是0-N关系,而不是可选的1-N关系.但我同意你的看法. (2认同)
  • 是的,它是一个UNIQUE约束,但由于这个约束,你还必须在代码中处理可能的异常... (2认同)

Wal*_*tty 5

可选关系在关系模型中绝对是可能的。

您可以使用 null 来表示不存在关系。它们很方便,但它们也会给您带来与 null 给您在其他地方带来的同样的头痛。它们不会造成任何麻烦的一个地方是连接。外键中包含 null 的行与引用表中的任何行都不匹配。所以他们退出了内部连接。如果你进行外连接,你无论如何都会处理空值。

如果你确实想避免空值(第六范式),你可以分解表。两个分解表之一有两个外键列。一个是您拥有的可选外键,另一个是引用原始表主键的外键。现在您必须使用约束来防止关系变成多对多,如果您想防止这种情况发生。