【问题标题】:Does a join table or associated table need a primary key?连接表或关联表是否需要主键?
【发布时间】:2014-10-26 21:05:18
【问题描述】:

对不起,我对此很陌生,

我有 3 个表,一个是 table1、table2 和 table12。 table1 有一个 PK table1_id,table2 有一个 table2_id 作为 PK。 table12有3个属性,FK table1_id, FK table2_id, and table12_name。

我没有 table12_id 有错吗?

感谢您的愚蠢帖子......

【问题讨论】:

  • 简短的回答是肯定的。即使该键本身不能用于链接您的数据模型,每个表应该都有一个 PK。在 MySQL 的情况下(实际上是 InnoDB),一个没有定义 PK 的表会在内部创建一个“隐藏”的表——这是有原因的,它们超出了这个问题的范围。虽然省略 PK 并没有错,但您确实应该创建一个。

标签: mysql


【解决方案1】:

您可能应该table12 上有一个明确的主键。问题是,其中哪一个是更好的主键:

  • 人工自动递增的主键,例如 Table12Id
  • 这对(table1_idtable2_id

请注意,其中的第二个对您可能想要的对施加了唯一性约束(如果您允许重复,那么您绝对应该有一个明确的 id)。

我强烈主张在所有表上使用数字、自动递增的主键。但是,对于联结表,任何一种方法都可以。这种推理是有逻辑的。所有代表实体的表都应该有唯一的键。这个表是一个关系的实现,所以复合主键是有意义的。

请注意,根据您使用表的方式,您可能仍需要在外键列的一个或两个组件上建立索引。

【讨论】:

    【解决方案2】:

    不一定是错的。

    如果要引用表中的特定行,则应使用主键。

    主键必须是标识行的唯一值。

    有时您不需要主键,例如您的情况, 其中 table12 似乎是连接其他两个的表 并命名该连接。

    您可能希望使连接唯一(表 12 中的一对 ID 值)。

    【讨论】:

      【解决方案3】:

      按照您的 3 个表的结构,很明显您在 table1table2 之间存在多对多关系,这就是您创建关联第三个表 table12 的原因。

      实际上,您所做的非常棒:table12 将有一个由 table2_idtable1_id 组合而成的主键,而 table12_name 是可选的,取决于您的需要。

      所以要直接回答您的问题:您已经拥有table12_id,它是table1_idtable2_id 的组合,必须 组合-可选地与table12_name- 组合table12 的密钥。

      【讨论】:

      • table12_name 是一个 access_date,它存储了 table1 中 user_id 的访问日期和 table12 的另一个 fk 的目录/path_id ... :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      相关资源
      最近更新 更多