文档 ID 是在文档数据库中分配给每个文档的唯一标识符。它作为主键,使开发人员能够高效地检索、更新或删除特定文档。与关系数据库中主键通常是整数或复合值不同,文档数据库通常使用简单灵活的标识符,如字符串、UUID 或数据库生成的值。例如,MongoDB 使用一个 _id
字段,它可以是用户提供的值或自动生成的 ObjectId(一个 12 字节的十六进制值)。这个 ID 对于基本操作至关重要:通过 ID 查询是访问文档最快的方式,因为数据库默认会对此类查找进行优化。
文档 ID 在可伸缩性和数据分布中起着关键作用。在分布式系统中,文档数据库通常使用 ID 来确定文档的存储位置,从而将数据分布到不同的节点上。例如,MongoDB 在其分片逻辑中使用 _id
字段来均匀分布文档。这确保了读写操作可以横向扩展。此外,文档 ID 在集合(一组文档)内强制执行唯一性,防止冲突。如果两个文档具有相同的 ID,数据库将根据操作拒绝第二次插入或覆盖现有文档。这种唯一性约束由数据库强制执行,无需手动检查。
在使用文档 ID 时,开发人员应考虑自动生成 ID 和自定义 ID 之间的权衡。自动生成 ID(如 MongoDB 的 ObjectId)保证唯一性并简化代码,但它们缺乏语义意义。自定义 ID(例如,用户名或产品 SKU)可以使查询更直观,但需要仔细验证以避免重复。例如,使用用户的电子邮件作为 ID 可能看似实用,但如果电子邮件更改或格式规则演变,则存在冲突风险。安全性是另一个考虑因素:可预测的顺序 ID(如自增整数)可能会暴露系统内部信息,从而使自动生成的随机 ID 更安全。最后,大多数文档数据库会自动为 ID 字段创建索引,确保快速查找——开发人员在设计查询时应利用此功能。