我正在研究使用mongodb的分片,並且大多數情況下,如果它非常直接。我對其他數據庫中的分片有一定的經驗,所以我並沒有問這個概念本身。有一件事我很困惑,而且在文檔中似乎沒有關於這個的任何內容,所以在這裏。碎片內_id的唯一性
是否_id
要求在分片內是唯一的,而不管分片鍵?
小規模(單片)測試似乎證實了這種情況。它看起來像是一個不太好的分拆方式,這讓我感到困惑。對我來說,要求shard-key
+ _id
是唯一的(即使用複合鍵)會更有意義,或者根據分片鍵最終被路由到的位置,您的行爲會不一致。我的數據模型使用確定性鍵,分片鍵是它的固有部分。所以我想這可以歸結爲,我在小規模測試中做錯了什麼?我是否需要將分片密鑰存儲兩次,一次作爲分片鍵字段,一次作爲_id
的一部分?或者有一些特殊情況,我可以用shard-key
和_id
來聲明一個複合密鑰?
更新
爲了完整,這是微不足道的情況下,我的測試,將以下兩個文件:
{"_id": 1, "shardkey": 1}
{"_id": 1, "shardkey": 2}
首先一個很明顯經歷,第二次失敗。如果我有兩個碎片,並且碎片鍵會被路由到不同的碎片,我認爲這兩個碎片都會成功。
我顯然可以結合分片鍵和id來爲mongodb創建_id
字段,因爲這實際上是我使用的關鍵字,但它似乎是一個奇怪的方式來處理來自數據庫體系結構的問題立場。
顯然,_id在技術上並不需要是唯一的,只在分片中。 mongodb似乎處理它的方式是強制_id在全球範圍內獨一無二,否則就會遇到麻煩。它不強制然而這唯一性約束,以及一個簡單的方法來做到這一點(和實際上其它數據庫做什麼)是定義鍵碎片鍵+ ID,但它似乎MongoDB的不這樣做(這是我的問題是,真的是這樣嗎?他們把它交給應用程序執行?)。我並沒有詢問索引,如果_id必須是全局唯一的,shard-key + _id上的唯一索引是多餘的。 – falstro