我有一个普遍的问题。
我非常喜欢生成这样的页面的 URL:
www.example.com/order/1e4fk678
其中 1e4fk678 是发布到生成输出的 php 文件的变量。
我的问题是:创建数据库表的最佳方法是什么。具有主键自动认证的 ID 只会生成像 1、2、3、...这样的 ID。
那么使用唯一 id 并导致快速数据库跟踪/跟踪的最佳方法是什么?
谢谢
我有一个普遍的问题。
我非常喜欢生成这样的页面的 URL:
www.example.com/order/1e4fk678
其中 1e4fk678 是发布到生成输出的 php 文件的变量。
我的问题是:创建数据库表的最佳方法是什么。具有主键自动认证的 ID 只会生成像 1、2、3、...这样的 ID。
那么使用唯一 id 并导致快速数据库跟踪/跟踪的最佳方法是什么?
谢谢
您的 DBMS 已经生成了唯一的 (auto_increment) 标识符。您在问题中没有说的是您是否希望 URL 中显示的值是不可预测的。
如果没有,那么您可以简单地对生成的 id 进行基本转换。
如果您需要该值是不可预测的,则将其作为字符串填充(大多数加密算法将自动执行此操作,直到块大小的倍数)并使用可逆加密对自动增量整数进行编码 - 并添加一些验证检测蛮力攻击。该方法不必是可逆的,但大多数使加密不可逆的方法(生成散列,使用数据作为加密密钥,使用随机加密密钥)会引入冲突风险,要求加密数据是更大。
如果引用是远程提供的,那么只需在数据上添加唯一索引即可。但是您仍然需要考虑如何处理碰撞。
使用随机值对低数据量有一些好处 - 您可以在生成时检测到冲突 - 但验证生成的值不冲突的成本以至少 O(logN) 的速率增加(对于索引字段) .
更新
所以使用 [a varchar 而不是 integer] 作为主键不会减慢我的数据库到中世纪?
不——这是你最不担心的。
您实际上可以在 mysql 中使用带有unique
约束的 String 列 - 甚至可以作为主键列。说啊:
`id` varchar(..) PRIMARY KEY
在您的表定义中。
看看这个问题,它处理字符串作为主键及其性能问题:MySQL - using String as Primary Key