在MySQL中使用唯一引用作为主键

时间:2013-03-04 13:50:06

标签: php mysql primary-key primary-key-design

我有一个普遍的问题。

我非常喜欢导致生成这样的网页的网址:

www.example.com/order/1e4fk678

其中1e4fk678是发布到生成输出的php文件的变量。

我的问题是: 什么是创建数据库表的最佳方法。 具有主键自动incertment的ID只会生成ID,如1,2,3 ...... ....

那么使用唯一ID的最佳方法是什么,以及快速数据库跟踪/跟踪?

由于

2 个答案:

答案 0 :(得分:3)

您的DBMS已生成唯一(auto_increment)标识符。您在问题中未说明的是您是否希望URL中显示的值不可预测。

如果没有,那么您只需对生成的ID进行基本转换。

如果您需要将值设置为不可预测,则将其填充为字符串(大多数加密算法将自动执行此操作直到块大小的倍数)并使用可逆加密来编码自动增量整数 - 和添加一些验证来检测暴力攻击。该方法不必是可逆的,但是大多数使加密不可逆的方法(使用数据作为加密密钥,使用随机加密密钥生成散列)会引入冲突风险,要求加密数据为更大。

如果远程提供引用,那么只需在数据上添加唯一索引即可。但是你仍然需要考虑如何处理碰撞。

使用随机值对于低数据量具有一些优点 - 您可以在生成时检测到冲突 - 但验证生成的值不会发生冲突的成本会以至少O(logN)的速率增加(对于索引字段)。

<强>更新

  

因此使用[varchar而不是整数]作为主键不会减慢我的数据库到中世纪?

不 - 这是你最不担心的事情。

答案 1 :(得分:0)

您实际上可以在mysql中使用带有unique约束的String列 - 甚至可以作为主键列。只是说:

`id` varchar(..) PRIMARY KEY

在你的表定义中。

看看这个问题,它会将字符串作为主键及其性能问题处理:MySQL - using String as Primary Key