Ruby Taiwan 搬到 ActiveRecord + MySQL 了
這陣子幫 @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/
hello
請問反著搬的主要原因除了效能還有別的考量嗎?
Relational Database 有 schema 比較安心。
ActiveRecord 有很多好用的功能,而這些在 Mongoid 暫時還未提供(例如 counter cache)。為了在未來更方便加新功能,先換到 ActiveRecord。
謝謝解說 :)
讚!MongoDB被濫用的太頻繁了。
MySQL 有這問題說 http://ask.inside.com.tw/questions/89-mysql-無法儲存-unicode-surrogate-字元
測試: