【问题标题】:Database Primary Key C# mapping - String or int数据库主键 C# 映射 - String 或 int
【发布时间】:2010-10-15 05:41:45
【问题描述】:

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

这是好的做法吗?如果是这样,为什么?

谢谢,利文·卡登

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

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

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

【问题讨论】:

  • Nothwind Starters Kit 数据库中的主键是什么 SQL 类型?
  • 没关系。让我快速获得 50 分... ;-)
  • 感谢您选择我的答案作为正确答案。我希望这些信息对您有所帮助。

标签: c# database architecture mapping primary-key


【解决方案1】:

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

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

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

【讨论】:

  • 你确定这就是 Lieven 的要求吗?询问 Varchar 是否应该映射到字符串、Int 到 int 等似乎非常明显,以至于实际上没有人会问它。当然,我可能是错的......
  • 我不知道。这肯定是他要问的 ;-)
  • 对不起。没仔细看数据库。似乎有时将 nchar(5) 用作主键数据类型。在这些情况下,id 是一个字符串。
  • 查看对 Mark Brittingham 答案的第一条评论。
【解决方案2】:

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

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

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

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

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

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

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

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

【讨论】:

  • 嗨,马克,如果您查看北风的架构(请参阅此处:sqledit.com/sr/samples/northwind.html),看起来很多表都使用字符来表示 PK。我会考虑这种相当不标准的做法,我认为这就是问题所暗示的。不过可能是错的。
  • 是的,这实际上是我的问题...抱歉造成误解。
  • 如果您查看Northwind 中的客户,他们使用字符作为PK。将 int 用作 PK 并为 char 增加一列会更好吗?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多