我有一个 users
表,它有一个自动递增的 id
和一个唯一的字母数字 pid
。只有 pid
是公开的,因为我不希望黑客通过对 id
运行 for
循环并提取所有用户数据来玩弄系统。
问题是,我什至需要首先存储自动增量 id
吗?我需要为其他与用户相关的表(如 user_details
、user_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/