2011-03-17 63 views
4

我有一個項目正在開發中。我使用mysql和ActiveRecord。看起來這個項目是一個很好的開始使用MongoDB(我從來沒有用過)的Mongoid適配器。將rails項目從MySQL移動到MongoDB

什麼是我的項目轉移到蒙戈的最佳方式?據我瞭解,我應該編輯我的模型(不是什麼大不了的),這就是全部?

如何從Mysql數據庫我的數據導出到蒙戈?我剛剛嘗試過yaml_db,但它不幫助我。

而第二個問題是我應該如何保持安全我Mongo的數據庫,如果我的系統崩潰(我的理解蒙戈將盡可能在RAM存儲數據丟失數據)。我的數據庫是10%/ 90%的寫/讀。

+0

爲什麼要切換? – 2011-03-17 11:29:20

+3

1.看起來像我的數據更合適文件意識形態; 2.教育理由; 3.這個項目對數據安全並不重要,所以我可以做這個實驗 – fl00r 2011-03-17 11:32:10

回答

7

我已經做了類似的事情最近,走近它作爲一個3步驟的過程。可能會有更多Rails的方式來做到這一點,但這種方式對我而言並沒有什麼意義。

我使用了一種迭代方法,並利用了MongoDB實際上是一個非常關係友好的文檔存儲系統。我從一個使用Mongoid的Relational Associations(頁面底部)references_many和referenced_in語法的關係設置開始。一旦工作正常,我將迭代重構爲更多面向文檔的方法。

1.轉儲現有的數據庫直MongoDB的

我用現有的模式,以蠻力轉儲SQL表和數據轉換成並行MongoDB的文件。我只是猛烈抨擊了我所擁有的一切,而不用擔心命名或關係;表格與集合的嚴格1:1映射。

這對我來說是一次性的過程。一旦所有事情都在這裏,步驟2和步驟3就將這些數據轉化爲我想要的結構。我也可以改變我的模型,因爲我不再需要與關係系統進行交互。您可能希望創建某種現有模型的副本,以防因任何原因需要返回此步驟。

2.遷移數據

對於下一步我有一個自定義的紅寶石外殼程序去了。再次說明,使用Rails功能可能會有更好的方式來完成此任務,但我採用了直接的事務腳本樣式方法。

我使用原始MongoDB Ruby driver,讀取在第1步中創建的數據庫,並將源集合轉換爲我想要的形狀。我用在步驟1中創建一個目標一個單獨的數據庫,因爲我反覆修正這個腳本變得越來越面向文檔的,因爲我重構我的模型在第3步

3.重構模型需要

我重構了我的模型,以便在步驟2中創建的數據庫上運行,使測試通過,然後返回步驟2中的腳本並進行更改以使數據庫更加面向文檔。

我重複了第2步和第3步,直到我重構了我的模型和文檔佈局,直到獲得最終結果。

+1

謝謝你分享你的經驗 – fl00r 2011-03-17 17:26:38

3

回覆:你的第二個問題

1.8.0現在支持單一服務器的耐用性,通過添加日誌記錄(見文檔here)。這表明,當你使用日誌時,mongo會每隔100ms發出一次批量提交(在未來的版本中會更頻繁)。一旦它在期刊中,如果它崩潰,它就會恢復並恢復。您可以請求調用Mongo,直到它安全地執行爲止(價格較低時性價比較高),或者如果使用副本集,您可以在返回之前指出應該將更改複製到多少個節點,以便您可以製作確定它已被複制到大多數/所有節點。

0

DIFF是,你必須嵌入對象的設施。 在您的模型中使用它。你也可以使用Event Sourcing來防止崩潰。

1

的人回答你的第二個問題,從遷移到MySQL的MongoDB的取決於你的數據看起來雖然。沒有可以轉換數據庫的自動工具。您可能只想編寫自己的轉換腳本。

我建議您只需將一個模型轉儲到YAML中,然後將該模型轉換爲使用Mongoid,然後讀取YAML並重新創建對象。

如果您有複雜的關係數據雖然MongoDB的可能不是什麼都在尋找反正。閱讀關鍵值存儲和關係數據庫之間的差異。

有一種流行的問題,涵蓋只是:When to use MongoDB or other document oriented database systems?

+0

我前幾天讀過這個問題。我明白我可以簡化我的數據庫,拋出一些連接,所以我想嘗試Mongo。 – fl00r 2011-03-17 12:14:20

+0

如果你真的只想嘗試MongoDB,只需寫一些新的東西。我實際上做了同樣的事情,前一段時間嘗試使用Mongoid:[寫下我自己的URL縮短服務](http://blog.impaled.org/2011/3/9/write-your-own-url-shortening -service-seriously.html) – 2011-03-17 12:24:25

+0

不是一個壞主意:) – fl00r 2011-03-17 12:27:33