DB:要使用标识列吗?

时间:2008-10-09 08:14:42

标签: database design-patterns

在设计表时,我的同事在这里说我应该避免使用标识列,因为它特定于SQL Server和MS Access,但我的观点不同,因为它使我的编码更简单。

我应该使用标识栏吗?如果不是从应用程序代码创建标识列的最佳方法是什么?

4 个答案:

答案 0 :(得分:10)

您无法将应用程序与数据库供应商完全分开。如果这样做,您将无法利用数据库为您提供的任何功能。

我要说使用标识栏。如果转移到Oracle(例如),则可以使用序列。几乎没有什么大变化。

我不知道你正在使用什么技术,但有一点可以帮助我使用像Hibernate或iBATIS这样的工具(我认为它们都可以用于Java和.NET),它们将你与数据库实现细节。然后,如果您更改数据库供应商,则无需更改应用程序代码,只需更改配置。 (理论上,至少!)

答案 1 :(得分:5)

使用标识栏!

它确实将“应用逻辑”与“业务逻辑”分开。

假设您使用“email”作为主键(这在“业务逻辑”方面确实有意义)。当该电子邮件不再存在且您的用户想要编辑您的电子邮件时,您会遇到麻烦。

答案 2 :(得分:3)

据我所知,每个稍微严重的RDBMS每个表都有一些独特的编号方案。

  1. Access和SQL Server具有标识列
  2. MySQL有自动增量列
  3. PostgreSQL有序列
  4. sqlite有一个隐含的ROWID列
  5. Oracle有一些顺序但我并不熟悉它
  6. 我主要使用它,理论上它并不总是一个要求,但如果你想保持参照完整性,int比存储更少,比varchar更容易比较,特别是如果你的外键比单个列更复杂。

答案 3 :(得分:2)

除非您完全了解其缺陷并且没有正当理由使用SEQUENCE或模拟序列生成器,否则请勿使用标识列。

序列更灵活,没有Identity列所具有的缺点/限制。

来自http://www.jumpingbean.co.za/blogs/mark/identity_autoincrement_fields_and_database_sequences

  

自动递增的痛苦

     

同时复制数据   保留身份价值

     

自动递增键可以成为   你需要复制整个时的痛苦   表格并保留主键   值。试图直接插入   一个标识列将导致一个   提出错误。通常是   供应商提供了一些陈述   让你暂时放弃   约束,以便您可以插入现有的   值。在MSSQL中你可以发布   命令

     

“SET IDENTITY_INSERT产品开启”。

     

其他供应商会要求您放弃   约束然后重新启用它。

     

更多痛苦 - 如何检索价值   新插入的行?

     

另外服务器通常   提供不同的检索方式   新的标识列值   插入行。对于MySQL,这是   LAST_INSERT_ID()函数和for   MSSQL是@@ identity,例如select   @@身份。

MS SQL Server 2011将支持SEQUENCE。

如果您使用不支持SEQUENCE的RDBMS服务器(如MSSQL 2011之前或MySQL),则有两种选择:

  1. 切换到PostgreSQL这是最简单的选择。您将获得企业级,完全开源的RDBMS服务器。如果你愿意,你也可以获得商业支持。
  2. 使用支持模拟SEQUENCE的数据访问库JPA 2.0个实施例,例如EclipseLinkHibernate制作this very trivial for you (TABLE strategy)。它与上述并不相互排斥。将JPA 2.0与PostgreSQL结合使用将比使用MySQL的原始JDBC更容易。