繁体   English   中英

与属性和代理键的多对多关系

[英]Many to many relationship with attributes and surrogate key

我有以下表格:

用户

  • ID INT PK
  • created_at DATETIME
  • 更新时间:DATETIME
  • is_archived BOOLEAN
  • 名称VARCHAR

出版商

  • ID INT PK
  • created_at DATETIME
  • 更新时间:DATETIME
  • is_archived BOOLEAN
  • 名称VARCHAR

订阅

  • user_id INT PK,FK
  • Publisher_id INT PK,FK

我希望订阅中具有其他属性,例如created_atupdated_atis_archived (与所有其他表一样)和其他字段。

我的选择是:

  • user_id INT PK,FK
  • Publisher_id INT PK,FK
  • created_at DATETIME
  • 更新时间:DATETIME
  • is_archived BOOLEAN
  • expires_at DATETIME

要么

  • ID INT PK
  • user_id INT FK
  • Publisher_id INT FK
  • created_at DATETIME
  • 更新时间:DATETIME
  • is_archived BOOLEAN
  • expires_at DATETIME

使用自动增量密钥而不同时使用两个外键作为主要复合密钥的利弊是什么?

在用于多对多关系的映射表中,我通常使用两项的复合主键。 这种方法的主要优点是,将记录作为唯一键来实现两者的唯一性。 而且,在大多数情况下,单独的自动递增id的存在不会带来太多好处,也不会给行带来更多的含义,因此对我而言,这比其他任何事情都更加令人讨厌。 就是说,如果两个表的映射本身就是一个重要的域实体,将在不将其他表加入其中的情况下偶尔使用,则将是有益的。

这种方法的主要缺点是查询可能会更加冗长,并且通常无法在没有关系中其他表的联接的情况下直接访问记录。 它还强制执行唯一性,因此您不能将同一用户和发布者的多个实例放在一起。

如果订阅是应用程序中的一个重要实体,可以在没有用户或发布者的情况下独立运行,那么您可能希望使用自动增量。 另外,如果您需要为用户和发布者的任何组合拥有多个记录(看起来像您一样),那么自动增量方法是正确的方法。

对我而言,这主要取决于您将如何访问数据。

如果您总是从userspublishers角度出发,并且只想获取相关数据,那么额外的主键将几乎已过时。

如果subscriptions表本身具有大量数据,并且并不总是依赖于用户或发布者的数据,那么访问该数据将有意义。

因此,如果它是传统的链接表,我看不出添加单独主键的理由。 如果您可以更像一个单独的实体来查看它-通常,如果您给它一个更有意义和更独立的名称-与userspublishers具有1:m的关系,那么另一个主键才有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM