2011-12-09 122 views
1

我是新来设置关系数据库。MySQL多个外键

我想在MySQL,USER表和COMPANY表中创建两个表。两者都应该能够有多个电话号码与他们关联,所以我创建了一个PHONE表,并希望从COMPANY到PHONE和从USER到PHONE都有一对多的关系。

目前似乎只是两个选项中我试图做的事:

  1. 请PHONE两个外键,一个引用的公司,一个引用用户。他们都默认为NULL,每个都在PHONE中创建一个新行时,我只填写我需要的一行。

  2. 有两个不同的表,USER_PHONE和COMPANY_PHONE。

这两个选项对我来说似乎都不是最佳选择。选项1看起来很乱,容易出现冗余问题。方案2似乎很重复且不必要。我倾向于认为选项2是做事的“官方”方式(开始怀疑这是为什么我听到有关MySQL的负面信息)。

有人吗?谢谢,

-Matt

回答

2

我不喜欢提出了如下设计(就像你):

首先,我们将有三个表

USER -- UserId, other fields 
COMPANY -- CompanyId, other fields 
PHONE -- PhoneId, PhoneNumber 

然后有两个表用于存储关系

COMPANY_PHONE -- CompanyId, PhoneId 
USER_PHONE -- UserId, PhoneId 
+0

你先生,非常优秀。 – mag725

1

有两个不同的电话号码表引发 一些问题。

  • 你必须在多个地方查找电话号码。
  • 如果一个人和一家公司共用一个电话号码,并且电话号码 发生变化,您可能会忘记在所有表格中更新它。
  • 它违反了Principle of Orthogonal Design,它松散地表示“不要有意义重叠的表”。

改为使用supertype/subtype schema。 (链接答案包括实现模式的示例SQL。)这种模式认识到用户和公司并不完全相同,但它们并没有完全不同。