我正在研究使用mongodb进行分片,大多数情况下是非常直接的。我在其他数据库中有一些分片经验,所以我不是在询问这个概念本身。有一件事我很困惑,文档中似乎没有任何关于此的内容,所以这里就是这样。
在分片中,_id
是否必须是唯一的,无论分片键是什么?
小规模(单一碎片)测试似乎证实了这种情况。然而,对于分片而言,它似乎不是一种不那么出色的方法,让我感到困惑。对我来说,要求shard-key
+ _id
是唯一的(即使用复合键)更有意义,或者你的行为会有不一致,具体取决于你的分片键最终路由到哪里。我的数据模型使用确定性键,而分片键是它的固有部分。所以我想这归结为,我在小规模测试中做错了什么?我是否需要存储两次分片键,一次作为分片键字段,一次作为_id
的一部分?或者是否有一些特殊情况我可以使用shard-key
和_id
以某种方式声明复合键?
更新
为了完整性,这是我正在测试的简单案例,插入以下两个文档:
{"_id": 1, "shardkey": 1}
{"_id": 1, "shardkey": 2}
第一个明显经历,第二个失败。如果我有两个分片,并且分片键将被路由到不同的分片,我认为两者都会成功。
我显然可以将shard-key和id结合起来为mongodb创建_id
字段,因为这真的是我正在使用的关键字,但这似乎是一种奇怪的方法来解决这个问题。数据库架构的立场。
答案 0 :(得分:1)
_id都必须是唯一的。分片键不需要是唯一的。它用于将集合拆分为块,可以将块拆分为构成数据库的分片。分片键需要提供足够的粒度以将集合中的文档拆分为块。将分片键链接到查询数据的方式显然是一个好主意,并使用与您查询的字段相关的分片键。这样,您运行的查询将很容易定向到相关分片以满足查询。如果分片键不够有选择性,则查询将需要转到多个分片以查找正确的文档。您可以在_id + shard-key上创建复合索引,并根据需要使其唯一。
我意识到这并没有完全回答这个问题。我很难理解你的问题。也许如果您可以发布您正在存储的文档示例以及您正在运行它的查询会有所帮助。