[TOC]
學習ORM過程中的一些概念理解
ORM
- 代碼中的類和數據庫中的表的映射.
- 代碼中的實例和數據庫中的記錄的映射.
下圖是一個最簡單的映射圖
下圖是一個比較完整的映射圖,包含了一對多,多對一這種映射關係.
數據持久化 VS 爲什麼要持久化
數據持久化
數據持久化,就是將數據(就是變量裏面的值)保存起來(從內存等掉電丟失的設備 --> 硬盤等掉電可以恢復的設備上),以便將來用到的時候能夠很方便的恢復.在ORM這裏特指將數據保存到數據庫.
所以本文中的數據持久化就是將內存中的數據模型(任何數據結構或對象)轉換爲存儲模型(關係模型,XML,二進制流),以及將存儲模型轉換爲內存中的數據模型的統稱.
數據模型可以是任何數據結構或對象模型,存儲模型可以是關係模型,XML,二進制流等.
爲什麼要持久化?
持久化封裝了數據訪問細節.
- 可以減少訪問數據庫存儲模型的次數
- 代碼可重用
- 低耦合,數據模型和存儲模型分離,不依賴於底層數據庫的類型,更換數據庫更容易.
domain model
數據模型如果是面向對象方式,也叫domain model .
Active Record VS Data Mapper
ORM裏面分成兩種類型.
Active Record
持久化過程和domain model關係比較緊密,或者說,domain model集成了持久化過程的方法,這種模式就叫做Active Record.
Ruby On Rails裏面的ORM好像也叫Active Record,與本文中的Active Record不是一個概念.當然ROR中的Active Record也是Active Record類型.
例子
user_record = User(name="ed", fullname="Ed Jones")
user_record.save()
user_record = User.query(name='ed').fetch()
user_record.fullname = "Edward Jones"
user_record.save()
Data Mapper
domain model和持久化過程是分開的.
例子,看主體
dbsession = start_session() # 持久化
user_record = User(name="ed", fullname="Ed Jones") # domain model
dbsession.add(user_record) # 持久化
user_record = dbsession.query(User).filter(name='ed').first() # 持久化
user_record.fullname = "Edward Jones" # domain model
dbsession.commit() # 持久化
舉例
-
Active Record
- Django ORM
-
Data Mapper
- SQLalchemy