我有以下表格:
用户
- 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_at、updated_at 和is_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/