首页 文章

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

提问于
浏览
0

我有以下表格:

users

  • id INT PK

  • created_at DATETIME

  • updated_at DATETIME

  • is_archived BOOLEAN

  • 名称VARCHAR

publishers

  • id INT PK

  • created_at DATETIME

  • updated_at DATETIME

  • is_archived BOOLEAN

  • 名称VARCHAR

subscriptions

  • user_id INT PK,FK

  • publisher_id INT PK,FK

我希望在 subscriptions 中有其他属性,例如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

OR

  • id INT PK

  • user_id INT FK

  • publisher_id INT FK

  • created_at DATETIME

  • updated_at DATETIME

  • is_archived BOOLEAN

  • expires_at DATETIME

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

2 回答

  • 2

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

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

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

  • 2

    对我来说,这主要取决于您将如何访问数据 .

    如果您始终从 userspublishers 视角开始并且只想获取相关数据,则额外的主键将非常过时 .

    如果 subscriptions 表本身具有大量数据并且并非总是依赖于用户或发布者数据才有意义,那么额外的主键对于访问数据是有意义的 .

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

相关问题