Database design 多对多关系:关联表与单个外键?

Database design 多对多关系:关联表与单个外键?,database-design,Database Design,给定:一个患者有多个医生,医生有多个患者 以下两种模式之间的区别是什么 选项1:关联表 患者[id,数据1] 医生[id,数据2] 病人医生[病人id,医生id] 选项2:单个外键 患者[id,数据1,医生id] 医生[id,数据2] 我唯一能想到的是,选项2要求您多次复制数据1,如果数据1很大,性能将受到影响。正确吗?没错,选项2是一对多关系。因此,每个患者都必须重复多次,这不利于数据库正常化 您的案例是多对多关系,这就是您需要关系表的原因 选项2不是性能的问题,而是设计的问题,患

给定:一个患者有多个医生,医生有多个患者

以下两种模式之间的区别是什么

  • 选项1:关联表
    • 患者[id,数据1]
    • 医生[id,数据2]
    • 病人医生[病人id,医生id]
  • 选项2:单个外键
    • 患者[id,数据1,医生id]
    • 医生[id,数据2]

我唯一能想到的是,选项2要求您多次复制数据1,如果数据1很大,性能将受到影响。正确吗?

没错,选项2是一对多关系。因此,每个患者都必须重复多次,这不利于数据库正常化

您的案例是多对多关系,这就是您需要关系表的原因

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

我唯一能想到的就是 选项2要求您复制 data1多次,如果data1为 大型演出将受到影响。是吗 对吗

不,那不对。“选项2”,其中patient.id可能是主键,防止您为每个患者插入多行。因此,每位患者只能有一名医生。这在一般情况下不起作用:初级保健医生可能会将患者转诊给过敏科医生、胃肠科医生、肿瘤科医生等等


有趣的是,考虑医生本身有医生的事实。

如果你认为选项2中的数据重复是可接受的,那么为什么不选择选项3:病人医生[病人,医生,ID,数据1,数据2]?同样,你的问题的标题不准确。您的两个选项不是关联表与单个外键。在这两种情况下,都有一个关联表(即,表的键由两个不同实体的键组成)。唯一的区别是,在选项2中,您没有用于患者实体的独立表。我可以添加一个唯一标识患者的非主键字段,并将patient.id视为人工键,但这样我就失去了索引查找的性能优势。否。如果添加了唯一标识患者的列(这意味着添加另一个候选键),则该列的值将阻止为每个患者插入多行。