1

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

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

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

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

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

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

任何人?谢谢,

-马特

4

2 回答 2

2

我确实喜欢建议以下设计(很像你的):

首先,我们将有三个表

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

然后有两个表来存储关系

COMPANY_PHONE -- CompanyId, PhoneId
USER_PHONE -- UserId, PhoneId
于 2011-12-09T19:08:58.780 回答
1

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

  • 您必须在多个地方查找电话号码。
  • 如果一个人和一家公司共享一个电话号码,并且电话号码发生了变化,您可能会忘记在所有表格中更新它。
  • 它违反了Orthogonal Design 原则,这大致意思是“不要有含义重叠的表”。

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

于 2011-12-13T02:25:18.393 回答