2015-08-18 78 views
1

我有一个users表,自动增加id,也是一个独特的字母数字pid。只有pid被公开曝光,因为我不希望黑客通过在id上运行for循环来游戏系统并提取所有用户数据。Mysql自动增量ID或字母数字ID作为外键

问题是,我甚至需要在第一位存储自动增量id?我需要选择其他用户相关表的外键,如user_details,user_orders等。我应该使用pid还是数字id作为fk?

有些担忧:

  • 加入 - 威尔联接使用idpid更有效率?
  • 索引 - 索引id会比索引pid更快吗?
  • 交易记录 - 当pid被用作foreign_key时,涉及多个原子插入的交易是否可行?
+1

这可能是有趣的:http://stackoverflow.com/questions/332300/is-there-a-real-performance-difference-between-int-and-varchar-primary-keys – PaulF

回答

1

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

推测,字母数字键可能会有很多字节,整数只会是4个字节(对于bigint来说可能是8个字节)。外键值存储在定义它们的任何索引中,所以短值很好。而且,拥有一个长度相同的密钥是很好的。

你没有提及你的pid来自哪里。例如,一个UUID(只是一个位串)是16个字节,而一个字符串是4个字节。尽管可以使用,但这会占用更多空间。

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

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