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

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

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

thx,Lieven Cardoen

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

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

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

为了提高效率,使用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。

这一切都取决于数据库中列的数据类型。

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

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

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

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