先來介紹一點關於 Ruby on Rails 這個框架 ,他採用了 ORM 來處理 Ruby 和資料庫的關係。
ORM 全名是 Object-Relational Mapping,顧名思義是將關聯式資料庫的資料映射至任一程式語言中並轉為物件,比較有名的 ORM 有 Ruby on Rails 的 ActiveRecord、Node js 的 Sequelize、.NET 的 Entity Framework。網路上已經有不少介紹 ORM 的文章,以下提供參考
在 Rails 官方的基礎教學中,這樣一行就可以輕鬆建立 model 並產生對應的 migration 建立 DB 中的 table
bin/rails generate model Article title:string text:text
而 Rails 自動建立的 model 長這樣,他繼承的 ActiveRecord::Base 提供了很多基礎的功能,包含最基本的 CRUD (Create , Read , Update , Destroy) 和各欄位的 getter、setter 等等。
class Article < ActiveRecord::Base
end
article = Article.create(title: 'Test Article')
article.title # 'Test Article'
透過這些預設好的 method ,我們可以很輕鬆的存取和改變 model 的值。
article.title = 'TEST2 Article'
article.save # 更新 article 的值
article.update_attributes(title: 'TEST2 Article') # 更新 article 的值
ActiveRecord 很方便,但過度依靠這樣的便利性卻也很容易產生壞習慣,進而慢慢的腐化 code base。
首先,一個 model 對應到 DB 的一個 table,在專案前期,這可以省去許多時間,但隨著專案越來越大,如果資料庫沒有好好規劃,同一個 table 的欄位可能會越來越多,其結果就是對應到一個很肥的 model,而我們就遇到了這樣的問題。
好的程式碼應該努力的方向是「高內聚,低耦合」,而我們的 code base 恰恰相反,一個 model 有 50 個以上的 methods 和 attributes,更慘的是程式中任何一個地方都有可能會出現他的身影,而為甚麼會變成這樣呢?我們下集待續~