Mysql 与属性和代理键的多对多关系
我有以下表格: 用户Mysql 与属性和代理键的多对多关系,mysql,sql,Mysql,Sql,我有以下表格: 用户 id INT PK 在DATETIME创建 在DATETIME更新了\u 是布尔值吗 名称VARCHAR 出版商 id INT PK 在DATETIME创建 在DATETIME更新了\u 是布尔值吗 名称VARCHAR 订阅 用户id INT PK,FK 出版者id INT PK,FK 我希望在订阅中有其他属性,例如创建、更新和存档(与所有其他表一样)以及其他字段 我的选择是: 用户id INT PK,FK 出版者id INT PK,FK 在DATETIME创
- id INT PK
- 在DATETIME创建
- 在DATETIME更新了\u
- 是布尔值吗
- 名称VARCHAR
- id INT PK
- 在DATETIME创建
- 在DATETIME更新了\u
- 是布尔值吗
- 名称VARCHAR
- 用户id INT PK,FK
- 出版者id INT PK,FK
- 用户id INT PK,FK
- 出版者id INT PK,FK
- 在DATETIME创建
- 在DATETIME更新了\u
- 是布尔值吗
- 在日期时间过期
- id INT PK
- 用户id INT FK
- 发布者id INT FK
- 在DATETIME创建
- 在DATETIME更新了\u
- 是布尔值吗
- 在日期时间过期
使用自动递增键而不是将两个外键都用作主复合键的优缺点是什么?在多对多关系的映射表中,我通常使用这两个项的复合主键。这种方法的主要优点是,记录作为两者的组合的唯一性是由它们作为主键来实现的。另外,在大多数情况下,单独的自动增量id的存在并没有提供太多的好处,也没有赋予行更多的意义,因此对我来说,它比其他任何东西都更具噪音。这就是说,如果这两个表的映射本身就是一个重要的域实体,在不将其他表连接到它的情况下,有时会使用它,这将是有益的 这种方法的主要缺点是查询可能会更加冗长,并且通常无法直接访问记录,而无需对关系中的其他表进行连接。它还强制唯一性,因此不能同时拥有同一用户和发布者的多个实例
如果订阅是应用程序中的一个重要实体,可以在没有用户或发布者的情况下独立运行,那么您可能希望使用自动增量。此外,如果您需要为用户和发布者的任何组合创建多个记录(看起来您会这样做),那么自动增量方法是正确的选择。在多对多关系的映射表中,我通常使用两个项的复合主键。这种方法的主要优点是,记录作为两者的组合的唯一性是由它们作为主键来实现的。另外,在大多数情况下,单独的自动增量id的存在并没有提供太多的好处,也没有赋予行更多的意义,因此对我来说,它比其他任何东西都更具噪音。这就是说,如果这两个表的映射本身就是一个重要的域实体,在不将其他表连接到它的情况下,有时会使用它,这将是有益的 这种方法的主要缺点是查询可能会更加冗长,并且通常无法直接访问记录,而无需对关系中的其他表进行连接。它还强制唯一性,因此不能同时拥有同一用户和发布者的多个实例
如果订阅是应用程序中的一个重要实体,可以在没有用户或发布者的情况下独立运行,那么您可能希望使用自动增量。此外,如果您需要为用户和发布者的任何组合创建多个记录(看起来您需要),那么自动增量方法是正确的方法。对我来说,这主要取决于您将如何访问数据 如果您总是从
用户
或发布者
的角度出发,只想获取相关数据,那么额外的主键将非常过时
如果subscriptions
表本身有大量数据,并且并不总是依赖于用户或发布者的数据才有意义,那么额外的主键访问数据才有意义
所以,如果它是一个传统的链接表,我不认为有理由添加一个单独的主键。
如果你能把它看得更像一个独立的实体——通常如果你能给它一个更有意义和独立的名字——它与
用户和发布者有1:m的关系,那么一个额外的主键就有意义了。对我来说,这主要取决于你如何访问数据
如果您总是从用户
或发布者
的角度出发,只想获取相关数据,那么额外的主键将非常过时
如果subscriptions
表本身有大量数据,并且并不总是依赖于用户或发布者的数据才有意义,那么额外的主键访问数据才有意义
所以,如果它是一个传统的链接表,我不认为有理由添加一个单独的主键。
如果你能把它看作一个独立的实体——通常是如果你能给它一个更有意义和独立的名字——它与用户和发布者有1:m的关系,那么一个额外的主键是有意义的