使用NULL外键还是指向保留记录?

时间:2011-03-02 14:01:31

标签: database-design

我正在设计一个包含消息和信使的数据库。

create table Message(
    MessageID int,
    MessengerID int,
    Content nvarchar(max)
)
create table Messenger(
    MessengerID int,
    MessengerName nvarchar(100)
)

有时候信使不明。在这种情况下你会使用NULL值,还是在Messenger表中使用未知信使的保留记录?我希望看到一个简短的解释,为什么一种解决方案比另一种更好。

2 个答案:

答案 0 :(得分:4)

我会使用NULL。

  1. 这正是NULL的存在。说“我不知道它是什么。”

  2. 在表格中保留记录总是很痛苦。您现在必须对您的用户说,嘿,如果您愿意,可以添加更多信使,您可以删除它们,甚至可以修改,但不要删除此行,也不要删除该行。这会导致不必要的并发症。

答案 1 :(得分:0)

都不是。我会使用另一个表作为信使信息:

CREATE TABLE MessageMessenger(
    MessageID int NOT NULL PRIMARY KEY REFERENCES Message (MessageID),
    MessengerID int NOT NULL REFERENCES Messenger (MessengerID));

(我注意到你的所有列都可以为空,你的表没有键。我先修复它!)

SQL中的

NULL不能准确表示“未知”的语义。以这种方式使用它经常会导致矛盾和不正确的结果,如果您设计的表格可以准确地模拟数据库应该表示的情况,那么就没有必要。

不使用可空外键的另一个原因是不同的DBMS不同意它们的工作方式,用户可能无法理解它们或正确使用它们。