【问题标题】:Many-to-many relationships: association table versus a single foreign key?多对多关系:关联表与单个外键?
【发布时间】:2011-02-12 22:09:10
【问题描述】:

Given:一个病人有很多医生,医生有多个病人。

以下两种模式有什么区别?

  • 选项 1:关联表
    • 患者[id, data1]
    • 医生[id, data2]
    • Patient_Doctor[patient_id, doctor_id]
  • 选项 2:单个外键
    • 患者[id, data1, doctor_id]
    • 医生[id, data2]

我唯一能想到的是选项 2 要求您多次复制 data1,如果 data1 很大,性能会受到影响。对吗?

【问题讨论】:

  • 如果您认为选项 2 中的数据重复是可以接受的,那么为什么不直接使用选项 3:Patient_Doctor[patient_id, doctor_id, data1, data2]?
  • 另外,您的问题标题不准确。您的 2 个选项不是关联表与单个外键。在这两种情况下,您都有一个关联表(即其键由 2 个不同实体的键组成的表)。唯一的区别是,在选项 2 中,您没有用于 Patient 实体的独立表。

标签: database-design


【解决方案1】:

我唯一能想到的是 选项 2 要求您复制 data1 多次,如果 data1 是 大的性能会受到影响。就是它 对吗?

不,这是不正确的。 “选项 2”(其中 patient.id 可能是主键)可防止您为每位患者插入多于一行。所以每个病人只能有一个医生。这在一般情况下是行不通的:初级保健医生可能会将患者转诊给过敏症专科医生、胃肠病专科医生、肿瘤专科医生等等。

为了好玩,想想医生自己也有医生。

【讨论】:

  • 好收获。我可以添加一个唯一标识患者的非主键字段,并将 patient.id 视为人工键,但这样我就会失去索引查找的性能优势。
  • 没有。如果您添加了一个唯一标识患者的列(这意味着添加另一个候选键),那么 那个 列的值将阻止您为每个患者插入多于一行。
【解决方案2】:

没错,选项 2 是一对多的关系。因此,每个患者都必须重复多次,这违背了数据库规范化。

您的情况是多对多关系,这就是您需要关系表的原因。

选项 2 不是性能问题,而是设计问题,患者可以有很多与他相关的字段,您不想复制(医疗保险、地址、电话等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2014-08-29
    • 2020-05-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2023-02-02
    相关资源
    最近更新 更多