php - Mysql autoincrement id or alphanumeric id 作为外键

标签 php mysql primary-key

我有一个 users 表,它有一个自动递增的 id 和一个唯一的字母数字 pid。只有 pid 是公开的,因为我不希望黑客通过对 id 运行 for 循环并提取所有用户数据来玩弄系统。

问题是,我什至需要首先存储自动增量 id 吗?我需要为其他与用户相关的表(如 user_detailsuser_orders 等)选择一个外键。我应该使用 pid 还是数字 id 作为 fk?

一些担忧:

  • 联接 - 使用id 的联接是否比pid 更有效?
  • 索引 - 索引 id 会比索引 pid 更快吗?
  • 事务 - 当 pid 用作 foreign_key 时,涉及多个原子插入的事务是否可行?

最佳答案

基本上,答案是"is"、"is"、"is"。

据推测,一个字母数字键可能有很多字节,而一个整数只有 4 个字节(对于 bigint 则为 8 个字节)。外键值存储在定义它们的任何索引中,因此短值是好的。此外,拥有一个长度始终相同的 key 也很好。

您没有提及您的pid 来自哪里。例如,UUID(只是一个位串)是 16 个字节,而字符串是 4 个字节。这会在任何索引中占用更多空间,尽管它可以被使用。

更重要的是,您在这里关心的是安全性。我认为让一个 id 面向用户,另一个在数据库中提供额外的安全层。例如,您可以在从 PID 到 ID 的转换(加密的、记录的、安全的接口(interface))周围具有高级别的安全性。

PID 永远不会出现在实际数据中,因此假设您遵循有关表内容的良好做法,获取许多表的完整副本可能仍无法识别用户。

关于php - Mysql autoincrement id or alphanumeric id 作为外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32070537/

相关文章:

php - Perl 有类似 PHP 的动态变量吗?

mysql - Sequelize : multiple where clause

primary-key - Hybris中PK分析仪的替代品是什么?

c# - 将大量ID发送到SQL Server进行过滤时,有没有办法提高性能?

sql - 两列作为主键还是一列作为 PK + 索引?

php - 使用 mysql 只插入一次行(在一个查询中)

php - 我如何对这些 base64 数字进行异或运算?

php - 列出多个 $query->set 的正确方法

java - 在mysql查询期间java代码中进行一些迭代后出现无限循环 "hangs"

java - Java中有类似mysql_num_rows的东西吗?