Mysql自动递增id或字母数字id作为外键


Mysql autoincrement id or alphanumeric id as Foreign Key

我有一个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永远不会出现在实际数据中,所以即使您遵循了表内容的良好实践,获得许多表的完整副本仍然可能无法识别用户。