我应该何时将列标记为主键?

时间:2016-07-05 14:23:35

标签: mysql sql database-design

我有一张这样的表:

id

我想起了几天。我想我不需要id列。目前token列是PK,我在id列上有一个唯一索引,使其既独特又快速搜索。

现在我想知道,我可以从表中删除token列并将id列作为PK吗?这是正常的吗?

老实说,到目前为止,我从未创建过没有token(它始终是PK)的表格,所以选择{{1}}对我来说很奇怪列为PK。

3 个答案:

答案 0 :(得分:2)

如果token是一个广泛的varchar,我会坚持你已经拥有的AI int PK。加入会更快。插入也是如此。更新可能会以相同的速度,因为为什么要更新该列,从而强制索引树更改。但是,通过不将宽varchar拖动到索引树中,插入对于子关系来说更快。

归结为偏好和可读性。至于可读性,这种varchar几乎没有。它不像“鞋子”这样的类别。这是一种悲惨的难以理解的非人形。因此,对于可读性而言,将token作为PK几乎没有争议。尽管如此,有时可能会有所帮助。

其他复合材料(多列索引)

当您开始将选择的PK与复合材料中的其他列(您可能选择的其他索引)相结合时,瘦int将变得非常明显,是最佳选择。即使是适度大的数据集。

答案 1 :(得分:1)

一般来说,我们通常更喜欢表的Id作为主键,但主要说的是它应该不为null并且应该唯一地标识表的其余记录(列),所以如果你想要您可以轻松地将令牌作为主键,但请确保它(Id)不应该依赖于其他表。 因此,无论何时您需要获取任何记录,您都可以使用令牌轻松获取它。

答案 2 :(得分:1)

3年后,您发布了这个问题后,我感到我不得不说些什么。考虑到当其他开发人员遇到与您的问题相同的问题而难以对这种结构化的表进行决策时,会弹出此问题。

我不多说,我想给你一个场景: 想象一下,您有一个任务要手动检查两个值value1 = 1223611547921cvdfrvalue2 = 1223611547921cvdfr是否相同...您会怎么做?正确的步骤是从开始到结束在两个值之间比较每个字符。然后*seconds完成后,您会说,这些值是相同的。

但是,如果您要比较两个值value1 = 2value2 = 2会发生什么?在一秒钟内,您说“他们是相同的”。

在计算机中发生相同的情况复杂的值导致更长的比较或加载时间。通常这段时间很少引起注意,但是如果您经营一个类似facebook的网站,数十亿用户每次都在线登录,会发生什么?

因此SELECT user_id WHERE id = "1"SELECT user_id WHERE token = "dki3j4rf9u3e40..."

有时它是关于简单性的,而简单性是现代编程中的首选方式。我看到开发人员使用错误的方法,而他们却一直在说“这是我的偏好”。通常,您偏爱的代码会导致编码错误,因此请务必保持警惕,并随着技术的发展寻找现代设计模式。