2017-08-02 50 views
0

我有一个表,用于存储上的服务的意见,表看起来是这样的:现在是否有可能有一个非空的外键指向MySQL数据库中的无行?

Comment table 
--------------------------- 
comment_id (auto-increment integer, primary key) 
comment (string) 
email (string) 

,会员系统添加到系统中,表中存储,看起来像这样的成员信息:

Member table 
--------------------- 
member_id (auto-increment integer, primary key) 
.... some other member info ..... 
email (string, unique) 

成员可以将多评论,而一个评论只有一个成员留下,或者它可以通过一个非成员留下(即电子邮件中成员表中不存在)。我知道我可以通过打开一个新表格来处理它(member_comment_pair),但是我很好奇,如果有一种方法,我可以在注释表中设置email的外键,这样它允许email可能无法找到在会员表中匹配?

NOTE:我正在使用MySQL,但万一它不可能在MySQL中,但允许在其他类型的数据库系统中,我也想知道。

回答

2

没有自我尊重的数据库系统会允许这样的事情,因为它破坏了拥有外键的全部目的。
你看,外键是确保relational integrity的数据库方式。
一个简短的解释是,引用列中的数据如果不存在于引用列中,则不能存在。

一旦你允许像你描述的循环孔,你可能会把外键扔出窗外。

我似乎有些奇怪的事情,MySql允许(就像它奇怪的行为组),但如果它允许一个破损的外键存在它不应该被称为关系数据库。

说了这么多,你可以选择至少3个可能的解决方案之一:

  1. 创建于Member表中的虚拟的记录,在Comment表“孤儿”记录将被链接到它。

  2. 允许在Comment表的email列中为空值。

  3. 完全删除外键。

我会选择(并在需要之前完成)解决方案第一。在Member表中创建一条记录(将其显示名称设置为“guest”或其他)并将所有孤立注释链接到它。

+0

评论中的电子邮件是为了将来在客人决定成为会员时进行身份识别,因此不能设置为指向虚拟会员。它不能为空,因为电子邮件也用于评论的一些后续操作。我需要外键的功能,以便在有注释连接到它时不能删除成员。所以看来这3种解决方案不适用于我的情况...... – cytsunny

+1

然后,不要通过电子邮件链接评论和成员,通过会员ID链接它们。一旦你这样做了,你就拥有了一个外键的所有好处,并且你可以免费使用你的电子邮件栏。如果评论是由登录成员撰写的,请自动填写他的电子邮件列。如果它是由客人写的,让他们填写任何他们想要的地址。 –

相关问题