代码之家  ›  专栏  ›  技术社区  ›  Chris Sobolewski

为了拥有主键,我应该添加一个自动主键吗?

  •  1
  • Chris Sobolewski  · 技术社区  · 16 年前

    我目前的布局方式是在第二个表中,FK指向主表,第二列是该项目获得的“受欢迎程度”总数。

    8 回复  |  直到 16 年前
        1
  •  3
  •   ChssPly76    16 年前

    你必须区分 primary key surrogate key

    1. 每个表都需要有主键吗?
    2. 每个表都需要有一个代理主键吗?

    除了一些特殊情况(多对多关系的关联表可以说是这种特殊情况的一个例子)。这样做的原因是,你通常需要能够(如果不是现在,那么在未来) 一贯地

    第二个问题的答案是 如果你的表代表一个核心业务实体,那么OR可以从多对一的关联中引用,使用代理键可能是一个好主意;但它是

        2
  •  2
  •   Trav L    16 年前

    每个表中都有一个主键:)

    它也有帮助 以防未来模式发生更改,并且2个值不再唯一。另外,现在内存要便宜得多,可以随意将其用作投资。 ;)

        3
  •  1
  •   Sabeen Malik    16 年前

        4
  •  0
  •   Justin Johnson    16 年前

    有趣的是,维亚康姆物业的一位DBA曾告诉我,使用 INT UNSIGNED VARCHAR(n)

        5
  •  0
  •   RC.    16 年前

    您不必在每个表上都有主键,但最好有主键,因为它们在规范化的关系数据库设计中几乎总是必要的。如果你发现了一堆你认为不需要PK的表,那么你应该重新审视表的设计/布局。阅读更多关于规范化的内容 see here.

    我能想到的几个场景中,你可能不需要或不希望在表上进行PK,那就是严格用于日志记录的表。(以限制写入日志和维护唯一索引的性能下降),以及在您仅存储用于通过应用程序进行测试的数据的情况下。

        6
  •  0
  •   Keith Randall    16 年前

    我持相反意见,如果你没有理由添加密钥,就不应该添加。如果需要,稍后添加此列非常容易。

        7
  •  0
  •   Bill Karwin    16 年前

    你说你有一个外键和另一个不是唯一的列。但这两列加在一起是独一无二的吗?如果是这样,您可以在这两列上声明主键约束。

    定义另一个代理键(也称为伪键——自动递增类型)很方便,因为有些人不喜欢在选择单行时引用两列。或者,他们希望可以自由地轻松更改其他列中的值,而无需更改用于寻址单个行的主键的值。

        8
  •  0
  •   Raj More    16 年前

    这是一种与规范化相关的技术,也是一种很好的实践。由自动递增的数字组成的密钥有很多好处:

    • 您的PK与数据无关。
    • 您永远不必更改PK值
    • 每一行都会自动具有一个唯一的标识符