科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道关于关系数据库主键的讨论

关于关系数据库主键的讨论

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

数据库开发人员通常都不赞同使用无意义的数值作为一个表的主键。然而,我们却强烈建议从无意义的数值建立主键,即我们使之作为代理键。在本文中,我们将讨论代理键的强大功能和自然键的固有缺欠。

作者:ZDNet China 2006年10月8日

关键字: 关系数据库 SQL Server

  • 评论
  • 分享微博
  • 分享邮件
代理键能遵循规则

显然,使用自然键作为主键会产生很多问题。现在将一个递增的值作为职工表的主键,然后看看结果会是怎么样。最重要的是,递增值必须是唯一的。由于系统能够自动生成这一递增值,可以避免了数据的输入错误。除此之外,当记录有输入时递增值一定会存在,所以主键一定不会为空。

一个代理键是不会改变的,而且只依赖于一个域,所以它特别的简洁。自动递增的域提供了一个唯一的,稳定的,简洁的主键。

其他的争论

很多数据库开发系统把唯一的索引应用到主键,这就消除了多个记录——因为系统不能接受多个记录。然而,你可以人为的使用一个唯一的索引,而不需要将一个主键作为一个索引。人为处理会消耗更多的资源。

一些开发人员认为主键应该识别相关的记录,也就是说,用户应该识别值为“Jane Smith”的主键与职工Jane Smith的记录相关联。如果值为“Jane Smith”的主键没有什么意义,比如只是一个递增的值,这就与职工Jane Smith的信息毫无关系。事实是这样的,没有什么规则确保主键值与记录有什么关联。

在一个设计合理的数据库中,用户是无法看到主键的值。实际上,用户也不需要知道主键是否存在,有时候主键对用户没有什么用处。代理键运行得很好,因为数值与记录之间存在isno的关系。

自然键与代理键的比较

当把这两种主键一一作比较,自然主键将会处于劣势,如表A所示。数据还是数据,数据不会成为系统的指针,因为这些选项不能受开发人员所控制,在程序中或系统自生成的键都是稳定的,它们也不能为空值。

表 A

规则 自然键 代理键
主键必须唯一的识别每一记录 但与输入和人为错误有关 系统自生成的数据是唯一的
一个记录的主键不能为空 只有数据可知时才能输入记录 当记录生成时才被系统建立
当生成记录时,主键的值必须存在 只有数据可知时才能输入记录 当记录生成时才被系统建立当记录生成时才被系统建立
主键必须保持稳定——你不能更改主键的域 自然键与一些商业规则和其他外部影响有关 代理键对程序功能和数据保持中立
主键必须简洁,不要包含过分的属性 一个自然键可以包含多个域 代理键只能包含多个域
主键的值不能改变 自然键通常改变 代理键通常不更改

对于数据库开发人员来说最重要的是在于良好的设计。为了避免出现程序开发之后的错误和过多的修补,我们建议采用代理键。这一简单的方法将为你在程序开发中提供坚固的,稳定的,灵活的基础。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章