【问题标题】:MySQL database design: one-to-many relationship with two parents and one childMySQL数据库设计:一对多的关系,两个父母和一个孩子
【发布时间】:2016-07-21 02:43:37
【问题描述】:

以下情况的正确设计是什么:

我的人 (t_people) 有电话号码 (t_numbers)。

看起来像与数字表中的外键的简单一对多关系。 EER diagram 1

但不仅人可以有电话号码 - 公司 (t_companies) 也可以有电话号码。

我只想使用一个电话号码表。看起来我需要两个一对多的关系,其中一个表 (t_numbers) 引用 t_people 或 t_companies。

我是否应该使用两个允许它们都为 NULL 的外键。 EER diagram 2

或者我应该根本不使用外键吗? 例如。我可以有一个“参考列”,其 ID 为一个或另一个表,以及第二个表,其中存储了第一列所引用的表。 [我不允许发布第三张图片...]

这样的问题一般是怎么解决的?

(或者我应该放弃只有一个电话号码表的计划,并为个人和公司制作一个。)

【问题讨论】:

    标签: mysql database-design


    【解决方案1】:

    我认为您应该坚持使用您的第一个图表,只需将类型(个人或公司)列添加到 t_people 表(可能会将表重命名为更通用的名称)。

    如果你希望它标准化(你会的)最好创建至少有 2 行(个人和公司)的实体类型表,并将该表与“t_people”相关联

    【讨论】:

    • 您是否建议将人员和公司放在同一张桌子上,然后用属性来区分它们?将它们重命名为 - 假设 t_thingsintheworldwhichcouldhavephonenumbers? t_peoples 将包含与 company 表完全不同的字段。
    【解决方案2】:

    同一个家庭的两个成员可以有相同的电话号码吗?一个人可以列出他的公司电话吗?

    但是……

    在我们清楚了解SELECTs 等需要什么之前,我们不要设计架构。

    如果您只需要显示“给定实体的所有电话号码”,那么 VARCHAR 可以有一个数字列表。

    如果您需要回答“这个号码属于谁/什么”,那么您需要关注一个电话号码表作为主导表。 可能有多行表示同一个电话号码。或者可能有一个多对多表(或多个这样的表)来将电话号码映射到实体。

    或者也许“实体”是焦点。实体可以是个人或公司。这闻起来像 3 个表——实体、个人和公司。

    推迟考虑外键;先把逻辑搞对,然后FK就到位了。

    【讨论】:

      猜你喜欢
      • 2016-05-13
      • 2020-08-28
      • 2019-02-01
      • 2020-06-21
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多