identity_insert的用法是否适用于元数据表

时间:2009-09-04 07:50:12

标签: c# sql-server metadata identity-insert

我的数据库中有几个表只包含“元数据”。 例如,我们有不同的grouptypes,contentItemTypes,languages等等。

问题是,如果使用自动编号,则可能会产生间隙。 id在我们的代码中使用,所以数字非常重要。

现在我想知道在这些表中使用自动编号是不是更好?

现在我们先编写数据库中的行,然后再编写代码。在我看来,情况并非如此。

你们有什么想法?

5 个答案:

答案 0 :(得分:2)

我会使用标识列,因为您建议将其作为主键(代理键),然后将您的候选键(系统中的标识符)指定为标准列,但对其应用唯一约束。这样您就可以确保不插入重复记录。

有意义吗?

答案 1 :(得分:1)

好吧,如果这些数字对你很重要,因为它们会在代码中,我可能不会使用IDENTITY。

相反,只需确保使用INT列并将其作为主键 - 在这种情况下,您必须自己提供ID,并且它们必须是唯一的。

答案 2 :(得分:1)

如果您的代码中的数字是硬编码的,请不要使用标识字段。在数据库中对它们进行硬编码以及它们不太容易改变,因为有人严重编写了数据库脚本。

答案 3 :(得分:1)

我会使用标识列作为主键,只是为了简单地将记录插入数据库,然后使用列作为元数据类型,我称之为我的LookUpType(int),以及LookUpId的列(代码中的int值)或选择列表中的值,LookUpName(字符串),如果这些值需要其他设置,那么可以使用额外的列。我个人使用两个额外的东西,LookUpKey用于层次关系,LookUpValue用于LookUpName的缩写或替代值。

答案 4 :(得分:1)

如果这些是仅用于将代码扩展到描述或包含其他属性的FK表,那么我不会使用IDENTITY。身份适用于永久插入用户数据,元数据表通常是静态的。当您对代码部署更新时,您不希望感到惊讶并且IDENTITY值与您期望的不同。

例如,您向“语言”表添加一个新值,您希望ID为6,但由于某种原因(开发不同步,另一个人没有实现他们的下一种语言类型等)你获得的下一个身份是不同的说法7.然后你插入或转换一堆使用语言ID = 6的行,这些都失败了,因为它不存在(它在元数据表中是7)。更糟糕的是,它们都会实现插入或更新,因为您认为属于您的值6已经在数据库表中,并且您现在混合了两个共享相同6值的项目,并且您的新7值未被使用。

我会根据你需要多少代码来选择合适的数据类型,你需要多长时间才能看到它(CHAR很好看几个值,有助于记忆)。

例如,如果您只有几个组,并且您经常会查看原始数据,那么char(1)可能会很好:

GroupTypes table
-----------------
GroupType            char(1)    --'M'=manufacturing, 'P'=purchasing, 'S'=sales
GroupTypeDescription varchar(100)

但是,如果有许多不同的值,那么某种形式的int(tinyint,smallint,int,bigint)可能会这样做:

EmailTypes table
----------------
EmailType            smallint    --2 bytes, up to 32k different positive values
EmailTypeDescription varchar(100)