MySQL多个外键

时间:2011-12-09 19:01:17

标签: mysql database foreign-keys relational-database redundancy

我是设置关系数据库的新手。

我正在尝试在MySQL中创建两个表,一个USER表和一个COMPANY表。两者都应该能够有多个与之相关联的电话号码,因此我创建了一个PHONE表,并希望从COMPANY到PHONE以及从USER到PHONE都有一对多的关系。

我想要做的事情似乎只有两个选择:

  1. 在PHONE中保留两个外键,一个引用COMPANY,另一个引用USER。它们都默认为NULL,每个都在PHONE中创建一个新行,我只会填写我需要的那个。

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

  3. 这两种选择对我来说都不是最佳选择。选项1似乎很容易出现冗余问题。选项二似乎非常重复且不必要。我倾向于认为选项2是“官方”的做事方式(开始怀疑这是否是我听到有关MySQL的负面信息的原因)。

    任何?谢谢,

    -Matt

2 个答案:

答案 0 :(得分:2)

我想建议以下设计(很像你的设计):

首先,我们将有三个表

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

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

COMPANY_PHONE -- CompanyId, PhoneId
USER_PHONE -- UserId, PhoneId

答案 1 :(得分:1)

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

  • 您必须在多个地方查找电话号码。
  • 如果某个人和公司共享电话号码和电话号码 更改,您可能会忘记在所有表格中更新它。
  • 它违反了Principle of Orthogonal Design,它松散地意味着“没有表格的意思重叠”。

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