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

sta*_*ack 5 mysql sql database-design

我有这样一张桌子:

// cookies
+----+---------+-------------------+------------+
| id | user_id |       token       |   expire   |
+----+---------+-------------------+------------+
| 1  | 32423   | dki3j4rf9u3e40... | 1467586386 |
| 2  | 65734   | erhj5473fv34gv... | 1467586521 |
| 3  | 21432   | 8u34ijf34t43gf... | 1467586640 |
+----+---------+-------------------+------------+
Run Code Online (Sandbox Code Playgroud)

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

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

老实说,到目前为止,我从来没有创建过没有id列的表(它一直是PK),所以我选择token列作为PK 是很奇怪的.

Dre*_*rew 3

就宽 varchar 而言token,我会坚持使用您已有的 AI int PK。加入会更快。插入物也是如此。更新可能具有相同的速度,因为为什么要更新该列,从而强制索引树发生更改。但是,通过不将宽 varchar 拖到索引树中,子关系的插入速度会更快。

这也取决于偏好和可读性。至于可读性,这样的 varchar 几乎没有什么可读性。它不像“鞋”那样是一个类别。这是一种悲惨的、难以理解的非人类形式。因此,就可读性而言,as 的 PK 几乎没有争议token。当然,有时它可能有点用处。

附加复合材料(多列索引)

当您开始将选择的 PK 与复合材料中的其他同类列(您可能选择拥有的附加索引)相结合时,薄型int将变得非常明显是最佳选择。即使是中等大的数据集。