gpt4 book ai didi

MongoDB 和复合主键

转载 作者:IT老高 更新时间:2023-10-28 11:01:57 29 4
gpt4 key购买 nike

我正在尝试确定在 mongo db 中处理复合主键的最佳方式。本系统中与数据交互的主键由 2 个 uuid 组成。 uuid 的组合保证是唯一的,但单个 uuid 都不是。

我看到了几种管理方法:

  1. 使用由 2 个值组成的主键对象(建议 here)

  2. 使用标准自动生成的 mongo 对象 id 作为主键,将我的键存储在两个单独的字段中,然后在这两个字段上创建复合索引

  3. 将主键设为 2 个 uuid 的哈希

  4. 我目前不知道的其他一些很棒的解决方案

这些方法对性能有何影响?

对于选项 1,由于键不连续,我担心插入性能。我知道这会扼杀传统的 RDBMS 系统,而且我已经看到迹象表明这在 MongoDB 中也是如此。

对于选项 2,拥有一个系统永远不会使用的主键似乎有点奇怪。此外,查询性能似乎不如选项 1。在传统的 RDBMS 中,聚集索引提供了最好的查询结果。这在 MongoDB 中的相关性如何?

对于选项 3,这将创建一个 id 字段,但在插入时它不会是连续的。这种方法还有其他优点/缺点吗?

对于选项 4,嗯...选项 4 是什么?

此外,还有一些关于将来可能使用 CouchDB 代替 MongoDB 的讨论。使用 CouchDB 会提出不同的解决方案吗?

更多信息:可以找到有关该问题的一些背景信息 here

最佳答案

你应该选择选项 1。

主要原因是您说您担心性能 - 使用始终存在且已经唯一的 _id 索引将使您不必维护第二个唯一索引。

For option 1, I'm worried about the insert performance do to having non sequential keys. I know this can kill traditional RDBMS systems and I've seen indications that this could be true in MongoDB as well.

您的其他选项并不能避免这个问题,它们只是将其从 _id 索引转移到辅助唯一索引 - 但现在您有两个索引,一个是右平衡索引,另一个是随机访问。

质疑选项 1 的原因只有一个,那就是您打算仅通过一个 UUID 值或仅通过另一个 UUID 值访问文档。只要您始终提供这两个值并且(这部分非常重要)您始终在所有查询中以相同的方式对它们进行排序,那么 _id 索引将有效地发挥其全部作用。

详细说明为什么在比较子文档时必须确保始终以相同的方式排序两个 UUID 值 { a:1, b:2 } 不等于 { b:2, a:1 } - 你可以有一个集合,其中两个文档具有 _id 的值。因此,如果您首先使用字段 a 存储 _id,那么您必须始终在所有文档和查询中保持该顺序。

另一个注意事项是 _id:1 上的索引可用于查询:

db.collection.find({_id:{a:1,b:2}}) 

但它可用于查询

db.collection.find({"_id.a":1, "_id.b":2})

关于MongoDB 和复合主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23164417/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com