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

时间:2014-12-23 15:06:09

标签: mysql sql

我有以下表格:

用户

  • id INT PK
  • created_at DATETIME
  • updated_at DATETIME
  • is_archived BOOLEAN
  • 名称VARCHAR

出版商

  • id INT PK
  • created_at DATETIME
  • updated_at DATETIME
  • is_archived BOOLEAN
  • 名称VARCHAR

订阅

  • user_id INT PK,FK
  • publisher_id INT PK,FK

我想在订阅中添加其他属性,例如 created_at updated_at is_archived (例如所有其他表格)和其他领域。

我的选择是:

  • user_id INT PK,FK
  • publisher_id INT PK,FK
  • created_at DATETIME
  • updated_at DATETIME
  • is_archived BOOLEAN
  • expires_at DATETIME

  • id INT PK
  • user_id INT FK
  • publisher_id INT FK
  • created_at DATETIME
  • updated_at DATETIME
  • is_archived BOOLEAN
  • expires_at DATETIME

使用自动增量键而不是将两个外键用作主要复合键有什么优缺点?

2 个答案:

答案 0 :(得分:2)

在用于多对多关系的映射表中,我通常使用这两个项的复合主键。这种方法的主要优点是作为两者组合的记录的唯一性由它们作为主键来强制执行。此外,在大多数情况下,单独的自动增量ID的存在并没有提供太多的好处或给出一行更多的意义所以对我而言噪音比其他任何东西都要多。也就是说,如果两个表的映射本身就是一个重要的域实体,有时会被使用而不会将其他表连接到它上,这将是有益的。

这种方法的主要特点是查询可能更冗长,如果没有与关系中的其他表进行连接,通常无法直接访问记录。它还强制实施唯一性,因此您不能将同一用户和发布者的多个实例放在一起。

如果订阅是您的应用中的一个重要实体,可以在没有用户或发布者的情况下独立存在,那么您可能希望使用自动增量。此外,如果您需要为用户和发布者的任何组合创建多个记录(这似乎是您的意愿),那么自动增量方法是正确的方法。

答案 1 :(得分:2)

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

如果您总是从userspublishers观点开始并且只想获取相关数据,那么额外的主键将非常过时。

如果subscriptions表本身有大量数据,并且并不总是依赖于用户或发布者数据,那么另外一个主键就可以访问数据。

因此,如果它是传统的链接表,我就没有理由添加单独的主键。 如果你可以把它看作一个单独的实体 - 通常如果你能给它一个更有意义和独立的名字 - 它与userspublishers有1:m的关系,那么额外的主键是有意义的