我有一个users
表,具有自动递增的id
和唯一的字母数字pid
。只有pid
是公开暴露的,因为我不希望黑客通过在id
上运行for
循环并提取所有用户数据来玩弄系统。
问题是,我甚至需要存储自动递增id
放在首位吗?我需要为其他用户相关的表如user_details
, user_orders
等选择一个外键。我应该使用pid
或数字id
作为fk吗?
一些担忧:
-
连接 -使用
id
连接会比pid
更有效吗? -
索引 -索引
id
是否比索引pid
更快? -
Transactions -当
pid
被用作foreign_key
时,涉及多个原子插入的事务是否可行?
基本上,答案是"是","是"answers"是"。
据推测,字母数字键有很多字节,而整数键只有4个字节(对于bigint来说是8个字节)。外键值存储在定义它们的任何索引中,所以短值是好的。此外,拥有始终相同长度的键是很好的。
你没有提到你的pid
来自哪里。例如,UUID(它只是一个位字符串)是16字节,而字符串是4字节。这将在任何索引中占用更多的空间,尽管它可以使用。
更重要的是,你在这里关心的是安全性。我认为一个id面向用户,另一个id在数据库中提供了额外的安全层。例如,您可以在从PID到ID的转换(一个加密的、有日志记录的、安全的接口)方面具有高级别的安全性。
PID永远不会出现在实际数据中,所以即使您遵循了表内容的良好实践,获得许多表的完整副本仍然可能无法识别用户。