我有一个用户表userid
和username
,并且都是唯一的。 在userid
和username
之间,这会更好地用作外键,为什么? 我的老板想用字符串?这可以吗?外键是字符串还是int首选?
回答
它看起来就像你有两个代理键(int userId
)和自然键(char
或varchar username
怎么说)。任何一列都可以用作表的主键,无论哪种方式,您仍然可以执行其他键的唯一性。
关于Natural和Surrogate Keys之间的权衡问题,有许多现有的讨论 - 您需要决定什么对您有用,以及您的组织内的“标准”是什么。
这里的一些考虑选择一个或其他方式时:
。如果你使用一个用户ID(如AUTO_INCREMENT INT)作为主用代理键(如用户ID INT AUTO_INCREMENT)
的情况下,键,那么引用表MyUsers
的所有表将使用UserId
作为外键。
可以仍然通过但是使用的附加unique index执行varchar username
列的唯一性,例如:
CREATE TABLE `MyUsers` (
`userId` int NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
... other columns
PRIMARY KEY(`userId`),
UNIQUE KEY UQ_UserName (`username`)
作为每@Dagon,使用窄的主键(如一个int
)具有的性能和存储的好处通过使用更宽的(和可变长度)值,如varchar
。这个好处也会影响更多的表格,这些表格参考MyUsers
,因为userid
的外键会变窄。
此外,如果所有表都通过username
耦合到MyUsers
,则更改用户名会更不方便(因为否则将违反外键关系)。如果在使用username
作为外键的表上需要更新用户名,则需要采用像ON UPDATE CASCADE这样的技术来保持数据完整性。
但是,使用代理整数键,可以更改用户名,而不会影响引用MyUsers
(但该更改仍可追踪)的表。
使用自然键(即用户名)
不利的一面是使用代理键,表并通过代理键引用MyUsers
总是需要一个连接回到谈判桌,以获得用户名的情况。 Natural key的一个潜在好处是,如果查询只需要引用MyUsers
的表中的Username
列,那么它不需要回到MyUsers
来检索用户名。从某种意义上说,自然键在关键列上提供了一种温和的缓存形式。
INT意愿指数更快,可能会或可能不会是一个问题,很难根据您所提供
一个int为4个字节,一个字符串可以尽可能多的字节,只要你喜欢。因此,int将始终表现更好。除非ofcourse如果你坚持与少于4个字符长:)
除了用户名,你不应该使用的列作为PK/FK如果列中的数据本身可以改变。用户倾向于更改他们的用户名,即使该应用现在不存在该功能,maby也会在几年内完成。当那一天到来时,你可能会有1000个引用该用户表的表,然后你将不得不更新一个事务中的所有1000个表,这很糟糕。
- 1. 检查varible是字符串还是int
- 2. 我应该使用外键的外键还是字符串值?
- 3. 如何检查字符串是float还是int?
- 4. readtext = new String(buff,0,read)......是字符串,int还是数组?
- 5. 确定行是日期,字符串还是int在Python中
- 6. 函数检查值是int还是float但不是PHP中的字符串
- 7. do-while循环需要一个int还是一个字符串?
- 8. 程序如何检测字符串是数字还是字符?
- 9. 对于Geom字段Recalc是WHERE还是INNER JOIN首选?
- 10. 从文件中获取值以查看它们是int还是字符串
- 11. 检查字符串中的所有字符是1,0还是“”
- 12. 检查字符串中的字符是1还是0
- 13. 将数组键设置为字符串不是int?
- 14. SqlDataReader是否具有与字符串键相同的Get *(int index)?
- 15. 解析JSON字符串(还是XML?)
- 16. 空字符串还是不空字符串?
- 17. Spring MVC 3.0:字符串是用于@PathVariable的首选类型吗?
- 18. int()函数的参数必须是字符串或数字,而不是“选择”
- 19. 键必须是字符串或符号
- 20. 如何在java中检查对象是字符串还是字符串数组?
- 21. 1D数组是作为字符串列表还是单个字符串工作?
- 22. 使用字符串而不是符号:好还是坏?
- 23. INT()参数必须是字符串或数字,而不是 'datetime.date'
- 24. 为UITableViewCell选择字符串 - 数组还是switch语句?
- 25. Java字符串比较:样式选择还是优化?
- 26. 检查字符串是拉丁字母还是西里尔文
- 27. 如何知道CONSTRAINT_NAME是主键还是外键?
- 28. RDBMS,外键合并还是单独表?
- 29. “虚拟”是C++中的限定符还是关键字?
- 30. 哪些是首选的:新的可空<int>或(int?)null?
我可以问你为什么在表中有两个独特的列? – 2011-01-27 14:16:45
为什么他不能有两个独特的列。就像有一个ID,电子邮件和用户名。他们可以是独一无二的,不是吗? – 2011-01-27 14:16:45
我承认。愚蠢的问题。只是想知道这两列是否真的描述了同样的事情。 nonnb很好地回答了这个问题。 – 2011-01-27 14:16:45