Sunday, October 16, 2016

物件關係阻抗不匹配(object-relation impedance) vs 快速開發的選項 ORM 或是 mongodb

物件關系阻抗不匹配是指:記憶體中的資料結構,往往是多維度的、巢狀的,和關聯式資料庫中的二維表格,其實是不同的。程式設計人員總是要花費不少時間,才能將記憶體中的資料結構轉換成資料庫中的資料結構。

現代許多流行的程式語言( ruby, python 等)都有提供「物件關系對應」 ORM( object-relational mapping ),主要是用來簡化程式開發人員處理「物件關系阻抗不匹配」問題。然而, ORM 麻煩的地方在於,批評者指出,它是一個 反面模式( anti-pattern )。是反面模式的理由主要是因為 ORM 違反了物件導向程式設計的重要原則:「封裝」。它沒有沒有完整地將 SQL 的細節隱藏在物件中,導致了程式變得難以測試。 批評者則是認為,應該要用 SQL-speaking object 來取代 ORM。

這個用 SQL-speaking object 來取代 ORM 的作法,固然是相當成熟、穩健的作法,因為有完整地封裝 SQL ,妥善地處理 object-relation impedance 問題。問題是,其實勢必還是有許多使用者之所以想用 ORM 最根本的理由,是懶得寫這麼多程式碼! 太麻煩了,因為要快速開發的話,根本一開始連需求都還沒有完全想好。

既然 ORM 有難以測試的問題的話,那還是使用 mongodb 吧。當然,等程式發展到一段時間之後,還是有可能會需要對資料庫做重新設計,但想要快速開發、想要跳過處理 object-relation impedance 的苦工,也只有 ORM 或是乾脆不要使用 RDBMS 這兩大類的解法了。