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

Php Mysql自动递增id或字母数字id作为外键,php,mysql,primary-key,Php,Mysql,Primary Key,我有一个users表,带有一个自动递增的id,还有一个唯一的字母数字pid。只有pid是公开的,因为我不希望黑客通过运行for循环id并提取所有用户数据来对系统进行游戏 问题是,我是否需要首先存储自动增量id?我需要为其他与用户相关的表(如user\u details,user\u orders等)选择外键。我应该使用pid还是数字id作为fk 一些关切: 联接-使用id的联接会比pid更有效吗 索引-索引id会比索引pid快吗 事务-当pid用作外键时,涉及多个原子插入的事务是否可行 基本上

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

问题是,我是否需要首先存储自动增量
id
?我需要为其他与用户相关的表(如
user\u details
user\u orders
等)选择外键。我应该使用
pid
还是数字
id
作为fk

一些关切:

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

基本上,答案是“是”、“是”和“是”

据推测,一个字母数字键将有许多字节,而一个整数将只有4个字节(或者对于bigint来说是8个字节)。外键值存储在定义它们的任何索引中,因此短值是好的。另外,拥有一把长度始终相同的钥匙也很好

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

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

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

这可能很有趣: