36b1f565fc83d9b67588123f2171b896

Ruby Taiwan 搬到 ActiveRecord + MySQL 了

2012-02-21 23:35:42 +0800chitsaou開發 節點 中發起
最後由 yllan2012-03-12 19:07:57 +0800回應 , 551次閱讀

這陣子幫 @XDite 把 Ruby Taiwan 搬到 MySQL。原本的後端是 Mongoid + MongoDB 。

換過去之後,就如同你所感受到的,速度變快了很多。

不過多數人都是從 MySQL 搬到 MongoDB ,很少人是反著搬的,所以我在我的 blog 寫了一篇這次搬家所遇到的問題,節錄重點如下:

在 Gemfile 加入

gem 'mysql2'

然後在 application.rb 砍掉 require 'xxxxxx/railtie' ,改成 require 'rails/all',並且要加上:

config.generators do |g|
  g.orm :active_record
end

確保搬資料時不會跟 Mongoid 衝突(它會搶走 ORM 的地位)

接著改 code :

desc(field) (scope) 改成 order("field DESC")

asc(field) (scope) 改成 order("field ASC")

object._id (attribute) 改成 object.id

MongoDB 的全文搜尋用 Ransack 先擋著(http://github.com/ernie/ransack)。

重建 database schema 的時候要注意:

1. MySQL 沒有 Array, Hash (embedded document) ,要換的話可以先 serialize 那欄位,或如果有別的 model 去關聯它,就最好將它 normalize 出來變成另一個 model。
2. Mongoid 的 String 資料型態沒有限長度, ActiveRecord 的 string 是 VARCHAR ,視情況改用 text 。

其他的話像是:

1. 原本的 counter cache 是手刻的,ActiveRecord 有提供就直接用了。
2. 原本的 visit counter 是手刻的 (Redis) ,先暫時移到 ActiveRecord 一個欄位。
3. soft-delete 可以視情況改用 ActsAsArchive 或 State Machine 加上 deleted state 。

最後是搬資料:

1. 把 Mongoid 做的 model 放在 MongoDB:: 這個 namespace 下面。
2. 從 Mongoid 的 model 拿資料出來,然後直接 INSERT 進去 ActiveRecord 的後端資料庫;可以用 Arel 算出有 escape 過的 SQL ,很方便。
3. INSERT 的時候,每個 column 都要複製過去,連 id 也要,不然 association ID 會亂掉。

全文的話可以看: http://blog.yorkxin.org/2012/02/21/migrate-from-mongoid-to-activerecord/

截至 2012-03-12 19:07:57 +0800,共收到 5 條回應
105d5812431a3311974c1e239c269610
warmwater 1樓, 於2012-03-08 08:44:23 +0800回應

hello

請問反著搬的主要原因除了效能還有別的考量嗎?

36b1f565fc83d9b67588123f2171b896
chitsaou 2樓, 於2012-03-08 11:22:55 +0800回應

Relational Database 有 schema 比較安心。

ActiveRecord 有很多好用的功能,而這些在 Mongoid 暫時還未提供(例如 counter cache)。為了在未來更方便加新功能,先換到 ActiveRecord。

105d5812431a3311974c1e239c269610
warmwater 3樓, 於2012-03-08 11:53:10 +0800回應

謝謝解說 :)

2735068c913a072744a799e3c0833b7b
fredwu 4樓, 於2012-03-11 12:41:18 +0800回應

讚!MongoDB被濫用的太頻繁了。

Ad23f5809b32c9dade553f80d6d7b2b9
yllan 5樓, 於2012-03-12 19:07:57 +0800回應
需要 登入 後方可回應,如果你還沒有帳號按這裡 註冊