資料庫與物件導向的不匹配阻抗 (二) ORM框架

這邊先提一下什麼是ORM框架,ORM 的全名是「Object-Relational Mapping」,即「物件關係映射」。

我們可以從維基百科看定義:

物件關聯對應(Object–relational mapping,簡稱ORM、O/RM 或 O/R mapping tool)在電腦科學中是一種程式技術,用於在關聯資料庫與物件導向程式語言的堆疊之間轉換資料。這實際上創建了一個虛擬的物件資料庫,可以在程式語言中使用。

在 .Net 生態系中,微軟開發了 Entity Framework 作為其主要的 ORM 框架。

ORM (Object-Relational Mapping) 框架

在實務上有些人會使用ORM框架。那ORM框架主要解決什麼問題?

不用寫SQL?

ORM 框架主要解決的是資料庫與物件導向程式設計語言之間存在的不匹配阻抗問題,其中包括:

  • 結構不匹配:物件導向語言支持繼承、封裝和多型等特性,這些在傳統的關係資料庫中難以直接實現。物件之間的關係是透過引用和組合來管理的,而關係資料庫則通過外鍵建立表之間的連結。

  • 識別機制不匹配:在物件導向世界中,物件通常由記憶體位址或參考來唯一識別;而在關係資料庫中,則通過主鍵來識別每條記錄。

成熟的 ORM 框架如 Entity Framework 通過自動映射功能,允許開發者專注於業務邏輯而非資料庫操作細節。

程式碼範例:不使用 ORM 特性 vs. 使用 ORM 特性

這邊使用微軟的 Entity Framework ORM 框架作為範例。

不使用 ORM 特性手動寫入

在未使用 ORM 特性的情況下,開發者需要手動處理物件的持久化和外鍵設置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using (var context = new SampleDbContext(options))
{
// 先插入 Team 資料
var team = new Team { Name = "Development Team" };
context.Teams.Add(team);
context.SaveChanges();

// 再插入 TeamMember 資料
var teamMember1 = new TeamMember { Name = "Alice", TeamId = team.Id };
var teamMember2 = new TeamMember { Name = "Bob", TeamId = team.Id };
context.TeamMembers.Add(teamMember1);
context.TeamMembers.Add(teamMember2);
context.SaveChanges();
}

使用 ORM 特性寫入資料

使用 ORM 特性,開發者可以直接操作更高層次的物件模型,而無需手動管理關聯和外鍵。物件和其關聯將自動被 EF Core 持久化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using (var context = new SampleDbContext(options))
{
var team = new Team
{
Name = "Sale Team",
TeamMembers =
[
new TeamMember {Name = "Alex"},
new TeamMember {Name = "Jeff"}
]
};

db.Teams.Add(team);
db.SaveChanges();
}

結語

使用 EF Core 和其他 ORM 工具,開發者可以更加專注於業務邏輯的實現,而減少對資料庫操作細節的關注。這樣不僅提高了開發效率,還可以降低因資料庫操作錯誤導致的風險。

參考資料來源

Wikipedia 維基百科

範例程式碼

您可以在以下 GitHub 中查看這個範例的完整程式碼:

ImpedanceMismatchSample