出于性能原因,我们正在将一个数据库从MySQL迁移到MongoDB,并考虑如何使用MongoDB文档的ID.我们正在讨论是使用ObjectID,这是MongoDB的默认设置,还是使用UUID(这是我们到目前为止在MySQL中一直使用的).到目前为止,我们支持这些选项的理由如下:
ObjectIDs:
UUIDs:
有人对其中一个选项是否比另一个更好以及为什么更好有什么见解吗?您是否曾在MongoDB中使用UUID而不是ObjectID?如果是,您遇到了哪些优点/问题?
出于性能原因,我们正在将一个数据库从MySQL迁移到MongoDB,并考虑如何使用MongoDB文档的ID.我们正在讨论是使用ObjectID,这是MongoDB的默认设置,还是使用UUID(这是我们到目前为止在MySQL中一直使用的).到目前为止,我们支持这些选项的理由如下:
ObjectIDs:
UUIDs:
有人对其中一个选项是否比另一个更好以及为什么更好有什么见解吗?您是否曾在MongoDB中使用UUID而不是ObjectID?如果是,您遇到了哪些优点/问题?
在Mongo中使用UUID当然是可能的,并且得到了合理的支持.例如,Mongo文档将UUID列为the _id
field的常见选项之一.
与其他一些答案相反:
UUID()
function,使用方式与使用ObjectID()
完全相同;到convert a UUID string into equivalent BSON object.0x04
编码时,它们是128位,而ObjectID是96位.(如果将其编码为字符串,将非常浪费,大约需要288位.)如果孤立地考虑Mongo DB,ObjectId是显而易见的 Select .它们在开箱即用的情况下运行良好,是一个完全有能力的默认值.使用UUIDdoes会增加一些摩擦,无论是在处理值时(需要转换为二进制类型等),还是在性能方面.这个小小的不便是否值得拥有一个标准化的ID格式,实际上取决于您对便携性和架构 Select 的重视程度.
你会在不同的数据库平台之间同步数据吗?您将来会将数据迁移到其他平台吗?您需要在数据库、其他系统或浏览器中生成IDs outside吗?如果不是现在,在future 的某个时刻?UUID可能值得这么麻烦.
IEFT最近发布了UUID规范的更新草案,将引入该格式的一些新版本.
具体地说,UUIDv6和UUIDv7基于UUIDv1,但翻转时间戳块,以便将位从最高有效位排列到最低有效位.这为结果值提供了一个自然顺序,该顺序(或多或少)反映了它们的创建顺序.新版本还排除了来自服务器MAC地址的数据,解决了对v1 UUID的长期批评.
这些改变需要一段时间才能实现,但(依我看)它们显著地现代化和改进了格式.