GUID
(全球唯一标识符):
优点
-
全球唯一性:
GUID
可以确保在全球范围内生成的 ID 是唯一的,这对于分布式系统、跨数据库和跨应用的数据合并非常有用。
-
去中心化:
- GUID 的生成不依赖于数据库,可以在任何地方(客户端或服务器)生成,而不需要查询数据库获取一个新 ID。因此,适用于分布式系统或离线场景。
-
防猜测性:
- GUID 是一个随机字符串,难以预测或枚举,这对安全性有好处,特别是在需要隐藏 ID 的场景中。
-
减少冲突:
- 在高并发的场景下,生成唯一的 GUID 比生成连续的自增 ID 产生冲突的概率更低。
缺点
-
存储空间占用大:
GUID
通常是 128 位(16 字节),而传统的整型自增 ID 通常是 4 或 8 字节。因此,GUID 占用的存储空间更大,会导致数据库索引变大、性能下降。
-
索引性能差:
- GUID 是随机生成的,因此插入操作会导致索引频繁分裂,降低性能。相比之下,自增 ID 可以保持索引有序。
-
可读性差:
- GUID 不易读或记忆,不便于调试和数据分析。
-
排序困难:
- GUID 的随机性使得按顺序排列变得复杂,而连续的自增 ID 在排序和分页方面更高效。
使用
数据库定义:
`ID` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'UID',
生成:
可写在工具类
public static string GetGUID
{
get
{
//Guid 是一个结构(struct),表示一个 128 位的全局唯一标识符。
//NewGuid() 是一个静态方法,生成一个新的 GUID。
return Guid.NewGuid().ToString().ToUpper();
}
}
在需要的地方使用:
主流的数据库 ID 字段生成方法
-
自增 ID(Auto-Increment/Identity):
- 描述: 这是最常见的 ID 生成方式,由数据库自动递增生成。每插入一条新记录,数据库会自动分配一个新的连续整数 ID。
- 优点: 简单、高效,占用空间小,索引有序。
- 缺点: 不能跨数据库或分布式系统使用,会暴露插入数量,存在并发冲突的可能。
-
UUID / GUID:
- 描述: GUID(Globally Unique Identifier)或 UUID(Universally Unique Identifier)是一个 128 位的唯一标识符,通常以十六进制表示。
- 优点: 全球唯一、不依赖中心化生成机制、适用于分布式系统。
- 缺点: 占用存储空间大,索引性能差,难以阅读。
-
组合键(Composite Key):
- 描述: 由多个字段组合生成一个唯一键。例如,
(RegionID, CustomerID)
。 - 优点: 可以确保每个字段的组合是唯一的,适合联合查询和多表关联。
- 缺点: 维护复杂,尤其在多表联接时性能可能较差。
- 描述: 由多个字段组合生成一个唯一键。例如,
-
自定义生成策略:
- 描述: 使用自定义逻辑生成 ID,例如根据时间戳、服务器节点、序列号等生成。
- 优点: 灵活性高,可以优化性能,适应特定的应用场景。
- 缺点: 实现复杂,需要精心设计和测试,可能会产生冲突。
-
雪花算法(Snowflake ID):
- 描述: Twitter 开发的生成唯一 ID 的算法,使用 64 位整数(8 字节)表示,其中包含时间戳、机器 ID 和序列号。
- 优点: 高效、短小、全球唯一,适合分布式系统。
- 缺点: 依赖服务器时钟,需确保时钟同步,否则可能生成重复 ID。
-
数据库序列(Database Sequence):
- 描述: 在 Oracle、PostgreSQL 等数据库中,序列是一种生成唯一数字的对象,可以作为主键。
- 优点: 灵活、可以控制步长、最小值、最大值等。
- 缺点: 不适用于跨数据库或分布式系统。
-
短 ID(Short ID)或哈希 ID:
- 描述: 使用哈希算法或短 ID 库生成简短的唯一字符串,例如
Base64
编码、Hashids
等。 - 优点: 紧凑、易于记忆,可以隐藏数据实际数量。
- 缺点: 有一定的碰撞概率,通常只适用于小规模系统。
- 描述: 使用哈希算法或短 ID 库生成简短的唯一字符串,例如