在表中选择什么主键?

时间:2012-02-29 10:20:52

标签: sql database

我有一个包含数百万条记录的巨大表格,假设我的自然键太大而且将来可能会改变,我想添加一个代理主键,并将该代理作为外键用于不同的表。 / p>

  • 我应该将自然键也作为主键吗?或者它应该像任何其他专栏一样?

此表的大部分访问权限都是使用自然键

进行搜索
  • 对于时间性能,是应该删除自然键还是将其定义为备用键?
  • 我不想拥有2个相同的自然键,如何使用自然键作为主键来强制执行?
  • 如果我使用自然键作为主键并添加另一个代理键并将其定义为主键,这意味着什么? 我试着寻找可以找到一个好例子的例子,链接/例子也会有所帮助。

2 个答案:

答案 0 :(得分:2)

我的建议是创建一个简单的INT数据类型主键,如果您使用的是MySQL AUTO_INCREMENTIDENTITY如果您使用的是MS SQL Server或SEQUENCE如果您使用的是Oracle。如果需要性能,主键的INT数据类型非常好。

自然键应该是一个索引列,以便更好地搜索。

答案 1 :(得分:0)

执行此操作的最佳方法是使用数据库生成的唯一键(例如MySQL中的AUTO_INCREMENT及其他RDBMS中的兄弟),并创建由此键和自然键组成的组合主键。

让我解释原因:

作为辅助唯一键的自然键具有创建非常糟糕的键本地化的巨大缺点:顺序键值往往分布在磁盘周围,使得密钥缓存的使用效率非常低(无论如何实现,这个概念)。自动增量键往往几乎完全本地化,即磁盘上的单个页面转换为单个磁盘搜索,很可能包含更大的键空间部分。

通过将“数据库自然”键与“应用程序自然”键(按此序列!!)组合到组合主键中,您可以获得两全其美的效果。如果自然键由一些随机因素组成,例如GUID,则尤其如此。