我有一个普遍的问题。
我非常喜欢导致生成这样的网页的网址:
www.example.com/order/1e4fk678
其中1e4fk678是发布到生成输出的php文件的变量。
我的问题是: 什么是创建数据库表的最佳方法。 具有主键自动incertment的ID只会生成ID,如1,2,3 ...... ....
那么使用唯一ID的最佳方法是什么,以及快速数据库跟踪/跟踪?
由于
答案 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