物件導向資料庫(OODB)以 OO 模型描述現實世界實體,核心概念包含:物件與 OID、封裝、類別與類別階層、訊息傳遞、繼承。這些概念構成了 OODB 與關聯式資料庫的根本差異。
| 概念 | 說明 | 關聯式對應 |
|---|---|---|
| 物件 | 實體統一模型化,具狀態(屬性)與行為(方法) | 元組 + 程序 |
| OID | 系統產生、全域唯一、不變的物件標識符 | 主鍵(但主鍵可變、業務相關) |
| 封裝 | 內部實現與外部介面隔離,透過訊息溝通 | 無對應(資料與程序分離) |
| 類別 | 共享屬性/方法的物件集合,物件為類別實例 | 關聯綱目 |
| 類別階層 | 單/多重繼承形成有限層次結構 | 無原生支援 |
| 訊息 | 外部呼叫物件方法的機制 | SQL 呼叫預存程序 |
| 繼承 | 子類別繼承父類別特性,支援覆寫與衝突解決 | 無原生支援 |
同一操作名稱可對應多種實作,具體連結哪個實作推遲到執行期根據物件實際類型決定。又稱動態綁定、多型派發。
// C++ 風格示意
class TDate {
public:
int month, day, year;
void Set(int m, int d, int y) { ... } // 同時設定三欄位
void Set(int m) { ... } // 僅設定月份
void Set(int d, int y) { ... } // 設定日、年
};
TDate myDate;
myDate.Set(12, 3, 2002); // 呼叫 3 參數版
myDate.Set(12); // 呼叫 1 參數版
myDate.Set(12, 2002); // 呼叫 2 參數版
SELECT emp.CalculateBonus() FROM Employee empEmployee 可能有 Manager、Engineer 子類別,各自實作不同獎金算法emp 實際類型動態派發正確 CalculateBonus()CASE WHEN type='Manager' THEN ...,實現真正多型查詢物件的屬性值可以是另一個物件,形成遞迴的「物件包含物件」結構。又稱複合物件、複雜物件。
class Address {
string street, city, zip;
}
class Customer {
string name;
Address homeAddress; // 內嵌物件
Address workAddress; // 另一個 Address 實例
List orders; // 集合屬性,元素為 Order 物件
}
class Order {
Date orderDate;
List items;
Customer customer; // 反向參考,形成物件圖
}
Manager IS-A EmployeeCustomer HAS-A Address| 操作 | 關聯式做法 | OODB 做法 |
|---|---|---|
| 讀取客戶含地址 | JOIN 兩表或兩次查詢 | 單一物件導航 cust.homeAddress |
| 修改地址 | UPDATE address 表 | 直接修改 cust.homeAddress.city = 'Taipei' |
| 刪除客戶連帶訂單 | 外鍵 CASCADE 或多 DELETE | 刪除根物件,系統依擁有關係級聯刪除 |
| 查詢訂單項目總價 | JOIN 3 表 + SUM/GROUP BY | order.items.Sum(item => item.Price * item.Qty) |