【问题标题】:MySQL multiple foreign keysMySQL 多个外键
【发布时间】:2011-12-09 19:01:17
【问题描述】:

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

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

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

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

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

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

有人吗?谢谢,

-马特

【问题讨论】:

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


    【解决方案1】:

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

    首先,我们将有三个表

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

    然后有两个表来存储关系

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

    【讨论】:

      【解决方案2】:

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

      • 您必须在多个地方查找电话号码。
      • 如果一个人和一个公司共用一个电话号码,并且电话号码 更改,您可能会忘记在所有表中更新它。
      • 它违反了Principle of Orthogonal Design,其大致意思是“不要有含义重叠的表”。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-21
        相关资源
        最近更新 更多