2010-08-30 13 views

回答

13

我覺得這是一個很好的問題,但答案將是有點根據您所使用的庫和你的「移民」的期望散。

讓我們來看看一些常見的遷移操作:

  • 添加一個字段:蒙戈使這很容易。只需添加一個字段即可完成。
  • 刪除字段:從理論上講,你實際上並不依賴於你的模式,所以在這裏「刪除」是相對的。如果您刪除「屬性」並不再加載該字段,則該字段是否在數據中並不重要。所以如果你不要關心「清理」數據庫,那麼刪除一個字段不會影響數據庫。如果你關心清理數據庫,你基本上需要運行一個巨大的循環對數據庫。
  • 修改字段名:這也是一個棘手的問題。當你重命名字段「你在哪裏」重命名它?如果你想讓DB反映新的字段名稱,那麼你基本上必須在DB上執行一個巨大的for循環。爲了安全起見,您可能需要「添加」數據,然後推送代碼,然後「解除」舊字段。

一些皺紋

然而,在一個ActiveRecord對象串聯一個字段名稱的概念,只是一個小小的傾斜。 ActiveRecord對象有效地提供了對象屬性到實際數據庫字段的映射。

在典型的RDBMS中,字段名的「大小」並不真正相關。但是,在Mongo中,字段名稱實際上佔用了數據空間,這在性能方面有很大不同。

現在,如果您使用某種形式的「數據對象」,比如ActiveRecord,爲什麼要嘗試在數據中存儲完整的字段名?數據庫應該可以按字母順序存儲所有字段,並在對象一側使用地圖。所以一個Document可以有8個字段/屬性,數據庫名稱可以是「a」,「b」...「j」,但是對象名稱可以是可讀的東西,比如「Name」,「Price」,「Quantity」。

我提出這個問題的原因是它增加了另一個摺痕修改字段名稱。如果你正在實現一個映射,那麼修改一個字段名稱根本不會導致任何遷移。

一些更多的皺紋

如果希望實現上刪除遷移,那麼你就必須這樣做一個部署。您還必須認識到,如果您這樣做,您不會保存任何當前磁盤空間。

Mongo預先分配空間,除非您進行數據庫修復,否則它並不真正「回饋」。因此,如果刪除文檔上的一堆字段,這些文檔仍然佔用磁盤上的相同空間。如果稍後移動文檔,則可以回收空間,但文檔只有在增長時纔會移動。

如果您從大量文檔中刪除大字段,您需要執行修復或檢查新的就地compact命令。

1

沒有銀彈。使用非關係數據庫添加或刪除字段更容易(只是不要使用不需要的字段或使用新字段),使用傳統數據庫重命名字段更容易(在字段重命名的情況下,通常必須更改大量數據在無模式數據庫中),數據遷移是平等的 - 取決於任務。

+0

我不認爲現場更名甚至存在最新的mongo。 – 2010-08-30 23:21:21

1

遷移過程與非關係型數據庫有什麼不同?

取決於是否需要更新所有現有數據。

在很多情況下,你可能不需要觸碰舊數據,如添加新的可選字段時。如果該字段也具有默認值,那麼如果您的應用程序可以正確處理缺少的字段,則可能也不需要更新舊文檔。但是,如果要在新字段上構建索引以便能夠搜索/過濾/排序,則需要將默認值添加回舊文檔。

喜歡的東西重命名場(瑣細在關係數據庫,因爲你只需要更新目錄,並不會觸及任何數據)是在MongoDB中的一大創舉(你需要重寫所有文件)。

如果您需要更新現有的數據,你通常需要編寫一個遷移功能,超過所有的文件進行迭代,並且更新一一(雖然這個過程可以共享和並行運行)。對於大型數據集,這可能需要很多時間(和空間),並且您可能會錯過事務處理(如果最終發生崩潰的遷移到了中途)。