.NET 中数据库表的唯一 ID

Posted

技术标签:

【中文标题】.NET 中数据库表的唯一 ID【英文标题】:Unique ID for database tables in .NET 【发布时间】:2011-01-07 09:48:32 【问题描述】:

有人可以列出广泛使用的方法来生成要在数据库表中使用的唯一 ID(PK 或其他)

表字段应该始终是字符串(为了灵活性)还是 GUID(紧密耦合)还是只使用 IDENTITY 始终?

如果它是字符串,那么我当然可以随时更改生成器逻辑。

对于 IDENTITY,我感到受到限制,因为我必须依赖数据库。但是,像 Invoice # 这样在外部发布字段是否是一个不错的选择。

对于小数据,比如 10000 条记录,我必须有什么选项来获得最小长度的唯一但随机的字母数字?

我面临很多情况,我需要这种唯一编号用于各种目的,如果我无法考虑一个好的选择,我必须回退到好的旧的和快速的 .NET Guid.newGuid.ToString()。

但我需要听取有经验的人的意见,一般准则和需要注意的事项是什么?

【问题讨论】:

我不明白为什么使用 GUID 是紧密耦合的。它将你与什么结合起来? 如果数据库提供者改变或者我想改变 PK 逻辑(从 GUID 到其他方法)。好吧,那将是罕见的。但仍然。 【参考方案1】:

您可以简单地使用以下命令来创建唯一的 id

Guid.NewGuid();

我个人更喜欢将表格字段设置为唯一标识符。

【讨论】:

【参考方案2】:

始终使用尽可能小的 ID。

如果您不需要在业务层中生成 ID(例如,许多客户节省往返行程),请在表中使用 IDENTITY 列,否则使用 GUID,但不要将聚集索引放在 GUID 列上,除非它是也是COMB GUID。

【讨论】:

但是你的身份依赖于数据库,另外一些地方我需要不可猜测的 id。那么,实现给定长度的字母数字随机字符串的通用方法是什么。 [碰撞的可能性应该随着长度的增加而直接降低。]

以上是关于.NET 中数据库表的唯一 ID的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择最新的带时间戳的值,该表对于一个列 id 有多个条目,对于每个唯一的列 id 和来自另一个表的数据

如何获取mysql数据库中某个表的主键或唯一字段

如何在数据库表的列中实现“主”Id 值

为用户分配一个提交到mysql表的唯一用户ID [关闭]

跨多个工作表的独特数据整合

数据库表的唯一索引问题