【问题标题】:Many to Many relationship Schema多对多关系架构
【发布时间】:2021-06-08 15:41:04
【问题描述】:

我有以下表格:

表信息

_id: unique id
record_id: varchar
info: varchar

表格电子邮件

_id: unique_id
record_id: references (INFO.record_id)
email: varchar

在这种情况下,电子邮件可以与不同的 INFO 行相关联。用适当的关系创建这样一个表的更好方法是什么?我可以在指向 INFO 上的非唯一 ID (record_id) 的电子邮件上创建外键吗?

然后我该如何查询,例如我对于每个 INFO 行都有一行,其中包括 emails 表中的所有电子邮件?

【问题讨论】:

    标签: sql-server database-design


    【解决方案1】:

    如前所述 - 引入 JOIN 表,如下所示。最好在被引用的表中保留对主键的外键引用。

    信息电子邮件

    info_id: references (INFO._id)
    email_id: references (EMAIL._id)
    

    InfoEmails 中的主键可以是串联的外键——例如info_id + email_id。这将确保唯一性,并且您不需要引入可能不需要的 Id 列。如果您决定如此,出于性能查找原因,还要在 email_id + info_id 上引入索引。

    【讨论】:

      【解决方案2】:

      如果您在emails 中创建引用INFO 表的record_id 列,则您具有一对多 关系。添加UNIQUE 约束使其成为一对一(或无)关系。如果您想要两个表之间的多对多关系,则必须使用第三个​​表来描述该关系。附加表将包含您想要相互关联的两个表的主键列。

      要查询关系,你JOIN在一个表和新表之间,然后再从新表到另一个表。如果您是 SQL 新手:是的,您可以在同一查询中拥有 许多 JOINs。您甚至可以多次加入同一个表。

      【讨论】:

      • 如果我保留引用但该列不是唯一的会发生什么? record_id 字段的加入是否按预期工作或会产生问题?
      • Unique 约束实际上是一对一(或无)。无约束(默认)仍然是一对多的,因为每封电子邮件只能与一个 INFO 相关。多对多意味着每个 INFO 可以关联到许多电子邮件,每个电子邮件可以关联到多个 INFO。
      猜你喜欢
      • 1970-01-01
      • 2017-01-28
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      相关资源
      最近更新 更多