2016-08-22 40 views
0

我正在研究使用mongodb的分片,並且大多數情況下,如果它非常直接。我對其他數據庫中的分片有一定的經驗,所以我並沒有問這個概念本身。有一件事我很困惑,而且在文檔中似乎沒有關於這個的任何內容,所以在這裏。碎片內_id的唯一性

是否_id要求在分片內是唯一的,而不管分片鍵?

小規模(單片)測試似乎證實了這種情況。它看起來像是一個不太好的分拆方式,這讓我感到困惑。對我來說,要求shard-key + _id是唯一的(即使用複合鍵)會更有意義,或者根據分片鍵最終被路由到的位置,您的行爲會不一致。我的數據模型使用確定性鍵,分片鍵是它的固有部分。所以我想這可以歸結爲,我在小規模測試中做錯了什麼?我是否需要將分片密鑰存儲兩次,一次作爲分片鍵字段,一次作爲_id的一部分?或者有一些特殊情況,我可以用shard-key_id來聲明一個複合密鑰?

更新

爲了完整,這是微不足道的情況下,我的測試,將以下兩個文件:

{"_id": 1, "shardkey": 1} 
{"_id": 1, "shardkey": 2} 

首先一個很明顯經歷,第二次失敗。如果我有兩個碎片,並且碎片鍵會被路由到不同的碎片,我認爲這兩個碎片都會成功。

我顯然可以結合分片鍵和id來爲mongodb創建_id字段,因爲這實際上是我使用的關鍵字,但它似乎是一個奇怪的方式來處理來自數據庫體系結構的問題立場。

回答

1

_id總是需要唯一,無論該集合是否被分片。分片鍵不需要是唯一的。它用於將集合拆分成可以拆分成構成數據庫的碎片的塊。分片鍵需要提供足夠的粒度以將集合中的文檔分成塊。將分片鍵鏈接到查詢數據的方式以及使用與查詢字段相關的分片鍵顯然是一個好主意。通過這種方式,您運行的查詢將很容易地定向到相關的分片以滿足查詢。如果分片鍵沒有足夠的選擇性,那麼查詢將需要去多個分片以找到正確的文檔。您可以在_id + shard-key上創建一個複合索引,並根據需要使其唯一。

我意識到這並不能完全回答這個問題。 tbh我正在努力理解你在問什麼。也許如果你可以發佈你正在存儲的文檔的例子以及你正在運行的查詢,這將有所幫助。

+0

顯然,_id在技術上並不需要是唯一的,只在分片中。 mongodb似乎處理它的方式是強制_id在全球範圍內獨一無二,否則就會遇到麻煩。它不強制然而這唯一性約束,以及一個簡單的方法來做到這一點(和實際上其它數據庫做什麼)是定義鍵碎片鍵+ ID,但它似乎MongoDB的不這樣做(這是我的問題是,真的是這樣嗎?他們把它交給應用程序執行?)。我並沒有詢問索引,如果_id必須是全局唯一的,shard-key + _id上的唯一索引是多餘的。 – falstro