数据库主键C#映射 - 字符串或int

时间:2009-03-24 15:07:47

标签: c# database architecture mapping primary-key

在Northwind Starters Kit中,数据库中的主键映射到C#中的字符串。

这是好习惯吗?如果是这样,为什么?

thx,Lieven Cardoen

ps:对不起可能是错误的问题...

在Northwind Starters Kit中,某些表具有数据类型为int的自动增量主键,而其他表具有数据类型为nchar(5)的非自动增量主键。为什么是这样? 嗯,显然有些主键只是代码(nchar(5)格式)。很抱歉使用了你的时间。

我认为数据类型int被映射到C#字符串,这对我来说似乎非常错误(但事实并非如此)。

3 个答案:

答案 0 :(得分:4)

这完全取决于数据库中列的数据类型。

良好做法是使用兼容/对应的数据类型。如果数据库使用int,请使用int。如果数据库使用uniqueidentifier,请使用Guid。如果数据库使用nvarchar,请使用string。

其他任何事情都会给我带来问题。保证。

答案 1 :(得分:3)

为了提高效率,使用Int作为主键更好,因为支持在机器代码级别比较Ints。使用在数据库级别实现的算法比较字符串。除非您的字符串非常短,否则Integer键也会占用页面上较少的空间(db页面)。

更新:根据董事会现在的另一个答案,我不确定我是否正确理解了您的问题。您是否在询问使用Integer作为密钥与字符串(可以选择哪一个)相比是否更好?或者您在询问您的C#类型是否应该与您的数据库类型匹配?我假设前者......如果是后者,我会感到非常惊讶 - 我认为他的回答是显而易见的。

更新:Lieven现在澄清了他的请求,说他实际上是在询问Int或nchar字段是否会更好作为索引,所以我对这个问题的原始看法是正确的

为了补充我的答案,Lieven,将Int作为你的PK几乎总是更好。例外情况是存在自然键,可以将其作为短字符串捕获(例如,在“Item”条目为char字符串的会计系统中)。原因有三个。

首先,整数表示为本机机器类型(32或64位字)并通过机器本机操作进行操作,而字符串不是,但必须使用char-by-char方法进行比较。因此,例如,当遍历PK索引(通常是BTree的一些变体)以定位记录时,每个节点处的比较操作是单个操作。这是一件大事吗?除非您正在使用真正庞大的数据库或事务负载,否则可能不会。如果你有一个自然的字符键,那么,无论如何,使用它!但是,如果你的“密钥”是姓氏的前五个字母加上第一个字母加上一个使其独一无二的数字,那么显然你的Int字段会好得多。

其次,整数占用的空间比几乎任何一个char键都少(假设使用Unicode的char(1)除外)。并且它不仅仅是主表页面中的空间,请记住索引字段也在索引中表示。再次,这是一个大问题?不是真的,除非你再次使用庞大的数据库。

最后,我们选择的键通常会在其他地方产生影响。因此,例如,如果您将一个表上的主键用作另一个表上的外键,则在使用外键插入或更新表中的记录时,上述两种效果都会被放大。

总结:使用最自然的键。但是,如果您可以在Int和Char之间进行选择,并且两者基本上都是任意的,那么请使用Int over the Char。

答案 2 :(得分:1)

始终对Sql数据类型使用相应的C#数据类型。正如其他海报所指出的那样,做其他任何事情都会在以后提出问题。

查看本文:http://msdn.microsoft.com/en-us/library/ms131092.aspx获取Sql Server / C#数据类型等价物的完整列表。