我在choosing a primary key上找到了这个阅读材料。
答案 0 :(得分:11)
我认为在实践中使用natural key很少比surrogate key更好。
以下是使用自然键作为主键的主要缺点:
您的键值可能不正确,或者您可能只想重命名键值。要编辑它,您必须更新将其用作外键的所有表。
通常很难拥有真正的unique自然密钥。
自然键通常是字符串。数字字段的索引将比字符串字段上的索引更紧凑。
主键的数据类型应该是什么硬性规则。数字键通常表现得更好,但你可以使用一个字符串,特别是如果表不大,并且引用它的表也不大。
答案 1 :(得分:1)
我使用代理键,通常称为非敏感键,由自动生成的int / bigint数据类型组成。
以下是我喜欢使用这些密钥的一些原因。
答案 2 :(得分:1)
键是一组具有两个基本特征的属性:唯一性和最小性。最小化意味着密钥只具有确保唯一性所需的最小属性数。
通常有三个标准用作选择好密钥的指南:
这些是很好的指导方针,但不是绝对的要求。在所有情况下,功能要求和数据完整性的需求应确定使用哪些密钥。
答案 3 :(得分:0)
以下是一些关于主键的博客文章:
http://www.mysqlperformanceblog.com/2006/10/03/long-primary-key-for-innodb-tables/
http://www.mysqlperformanceblog.com/2007/03/13/to-uuid-or-not-to-uuid/
答案 4 :(得分:0)
我在专业系统(主要是银行软件)中使用了很多不同的数据模型,并且有不同的解决方案。我看过GUID解决方案,似乎没有太多影响性能。我已经看到“服务提供的号码作为系统范围的唯一号码”。我已经看到了提供类似GUID“但更短”的算法。我还看到使用了业务密钥(如帐号),这是设计不佳并导致问题,我不推荐它。我已经看到每个表的自动递增键。
我最喜欢什么?服务作为系统范围提供的号码。它运作良好。使用简单的密钥转换表,可以使用用户密钥(如帐号)来查找唯一的数字和什么类型的数据对象(不一定是表,因为如果数据对象,相同的唯一键可能适用于多个表根据其类型分为不同的表格。
那么有博客还是其他什么?好吧,我有一本书推荐Graeme Simsion和Graham Witt称为“Data Modeling Essentials”。他们可能不会建议我的首选解决方案,但他们提供了许多真实的实例,并展示了可能的不同解决方案。
答案 5 :(得分:-4)
我总是选择uuid作为主键。与int / long键相比,有一点点开销,但是有很多好处:你不能遇到类型溢出,你可以在不更改主键的情况下稍后分片数据库,你可以与其他系统集成并确保你的主键总是唯一的,uuid不能猜到等。