sta*_*ack 4 mysql 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对我来说很奇怪。
Kár*_*agy 13
这取决于很多事情。假设您使用的是 innodb,它的价格会很高。因此,您需要评估和平衡用例的利弊。
大 varchar 列的缺点:
自然主键的优点:
大多数时候,出于空间考虑,人们试图使用自然键来消除 id 列,这与实际发生的情况正好相反。如果您希望将其用于查询优化并且其弊大于利,那么就去做吧。
如果表有自然的主键不会改变,那么用它作为PK是合适的
如果有时很长,您可能会使用 ID 作为性能的 PK
正如 Nagy 的回答中详细介绍的那样。因为它是乱序的,所以它会碎裂。唯一索引也会碎片化。
如果您使用自然键,则 FK 会更长。但是现在在查询中,您不必重新连接到该表来获取自然键。