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

标签 mysql sql

我有以下表格:

用户

  • id INT PK
  • 创建于 DATETIME
  • updated_at DATETIME
  • is_archived BOOLEAN
  • 名称为 VARCHAR

出版商

  • id INT PK
  • 创建于 DATETIME
  • updated_at 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
  • 创建于 DATETIME
  • updated_at DATETIME
  • is_archived BOOLEAN
  • expires_at DATETIME

  • id INT PK
  • user_id INT FK
  • publisher_id INT FK
  • 创建于 DATETIME
  • updated_at DATETIME
  • is_archived BOOLEAN
  • expires_at DATETIME

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

最佳答案

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

这种方法的主要缺点是查询可能有点冗长,而且如果不与关系中的其他表进行联接,您通常无法直接访问记录。它还强制执行唯一性,因此您不能同时拥有同一用户和发布者的多个实例。

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

关于mysql - 与属性和代理键的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27622970/

相关文章:

php - fetch() 在 while 循环内不起作用

c# - 无需在客户端安装 mysql 连接器即可将应用程序转换为工作

sql - 运算符不存在 : timestamp without time zone ~~* unknown ruby code

java - 这个持久性单元配置有什么问题?

MySQL在缩短字符串时添加点(..)

PHP 不显示来自 MySQL 数据库的结果

sql - 如果我有一个带有 where 子句的 sql 查询,当 `where` 上没有运算符时会发生什么?

sql - 在 Laravel 中访问数据透视表数据

sql - 如何在oracle/sql中将数字转换为时间戳

sql - Sql 语句的成本是什么意思?