PostgreSQL:生成 UUID 主键
通用唯一标识符 (UUID) 是一个 128 位的数字,其生成方式使其极不可能在已知宇宙中被其他人生成相同的标识符(全局唯一)。
在 PostgreSQL 中,您可以使用 uuid-ossp
扩展中的 uuid_generate_v4
函数生成 UUID。
什么是 UUID?
UUID 代表通用唯一标识符。它是一个 128 位的标识符,用于在计算机系统和应用程序中唯一标识信息。UUID 通常表示为一个 36 个字符的字符串,通常采用类似 "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 的格式,其中每个 "x" 代表一个十六进制数字。
UUID 的目的是提供一种生成标识符的方法,这些标识符极不可能与其他标识符冲突,即使它们是在不同的系统或不同的时间创建的。这使得 UUID 在需要在分布式系统、数据库或其他应用程序中唯一标识对象、实体或资源的场景中特别有用。
何时使用 UUID?
当您需要生成全局唯一标识符而无需使用 ID 生成服务时,可以使用 UUID,例如,OpenTelemetry 使用 16 字节的标识符作为跟踪 ID。
通常,UUID 是通过获取 16 个随机字节生成的,其唯一性基于数量,而不是生成算法。此类标识符已被证明是唯一的,但比 64 位顺序数字更大,速度略慢。
提示
UUID 比 64 位顺序标识符略慢。仅当您没有简单的方法来生成更小的顺序标识符时才使用它们。
PostgreSQL 中的 UUID
PostgreSQL 需要一个扩展来支持 UUID 列类型。该扩展包含在 postgresql-contrib-*
包中
sudo apt install postgresql-contrib-14
然后,您需要在每个将要使用它的数据库中安装该扩展
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Go 中的 UUID
要在 Go 中使用 UUID,您需要安装 google/uuid 包。
go get github.com/google/uuid
satori/go.uuid 也能正常工作,但它似乎不再维护了。
生成 UUID
在 PostgreSQL 中
SELECT uuid_generate_v4();
在 Go 中
import "github.com/google/uuid"
fmt.Println(uuid.New())
在模型中使用 UUID
您可以在 Bun 模型 中使用 uuid.UUID
类型,如下所示
import "github.com/google/uuid"
type Story struct {
ID uuid.UUID `bun:"type:uuid,default:uuid_generate_v4()"`
Title string
AuthorID uuid.UUID `bun:"type:uuid"`
}
UUID
字段名称也适用
type Story struct {
UUID uuid.UUID `bun:",pk,type:uuid,default:uuid_generate_v4()"`
Title string
AuthorUUID uuid.UUID `bun:"type:uuid"`
}
监控性能
要 监控 PostgreSQL,您可以使用 OpenTelemetry PostgreSQL 接收器,它随 OpenTelemetry 收集器一起提供。
OpenTelemetry 收集器 是一个宝贵的组件,用于在分布式环境中监控应用程序和基础设施。它能够高效地收集、处理和导出数据,以提高软件系统的可观察性、故障排除和性能。
Uptrace 是一个 开源 APM,用于 OpenTelemetry,它支持分布式跟踪、指标和日志。您可以使用它来监控应用程序并解决问题。
Uptrace 带有一个直观的查询构建器、丰富的仪表板、警报规则、通知以及大多数语言和框架的集成。
Uptrace 可以在一台服务器上处理数十亿个跨度和指标,并允许您以 10 倍更低的成本监控您的应用程序。