2

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

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

谢谢,列文卡登

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

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

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

4

3 回答 3

4

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

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

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

于 2009-03-24T15:10:47.837 回答
3

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

更新:根据板上的其他答案,我不确定我是否正确理解了您的问题。您是否在问与字符串相比,使用整数作为键是否更好(可以选择其中任何一个)?还是您在问您的 C# 类型是否应该与您的数据库类型匹配?我假设是前者……如果是后者,我会感到非常惊讶——我认为他的答案是显而易见的。

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

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

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

其次,与几乎任何 char 键相比,整数只占用更少的空间(假设使用 Unicode 的 char(1) 除外)。而且它不仅仅是主表页面中的房间,请记住索引字段也在索引中表示。再说一次,这有什么大不了的吗?不是真的,除非您再次使用大型数据库。

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

总而言之:使用最自然的键。但是,如果您可以在 Int 和 Char 之间进行选择,并且两者本质上都是任意的,请选择 Int 而不是 Char。

于 2009-03-24T15:11:00.207 回答
1

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

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

于 2009-03-24T15:12:54.290 回答