← Back to list

Domain Model 與 Data Model

過去我在設計Model時,主要都會以Data Model的思維去做設計,

Yang Chen · 2025-10-09 03:04 · 0 claps · 2.5 min read
#domain-model
Open on Medium ↗

Domain Model 與 Data Model

過去我在設計Model時,主要都會以Data Model的思維去做設計,

很直覺的會以資料庫欄位去設計Model模型,

而在驅動領域設計(Domain-Driven Design)的流行下,

Domain Model 受到了更大的重視,

Domain Model與Data Model的區別主要在於業務邏輯與方法,

如下Domain Model範例

// Domain Model(包含業務邏輯)
public class Order
{
    public int Id { get; private set; }
    public List<OrderItem> Items { get; private set; } = new List<OrderItem>();
    public decimal TotalAmount => Items.Sum(item => item.GetSubtotal());

    public void AddItem(Product product, int quantity)
    {
        if (quantity <= 0) throw new ArgumentException("數量必須大於0");
        Items.Add(new OrderItem(product, quantity));
    }
}

public class OrderItem
{
    public Product Product { get; private set; }
    public int Quantity { get; private set; }

    public OrderItem(Product product, int quantity)
    {
        Product = product;
        Quantity = quantity;
    }

    public decimal GetSubtotal()
    {
        return Product.Price * Quantity; // 計算小計,業務邏輯在這裡
    }
}

而過往的DataModel設計就會如下

// Data Model(資料庫用的純資料結構)
public class OrderEntity
{
    public int Id { get; set; }
    public decimal TotalAmount { get; set; }  // 通常會存在資料庫欄位
}

public class OrderItemEntity
{
    public int Id { get; set; }
    public int OrderId { get; set; } // 外鍵
    public int ProductId { get; set; } // 外鍵
    public int Quantity { get; set; }
    public decimal Price { get; set; }
}

可以看出主要差異在於,資料模型只重視資料欄位,沒有業務邏輯與行為,

而Domain Model則會包含了業務邏輯來處理,

也因此,Domain Model與Data Model是可以相輔相成的存在,

資料庫操作使用Data Model來處理,使用Domain Model來處理業務行為,

達成單一職責原則(SRP),降低類別間耦合增加高內聚。


메타데이터
post_id
f3cb753f87f5
slug
domain-model-與-data-model-f3cb753f87f5
url
https://medium.com/@s97172634/domain-model-%E8%88%87-data-model-f3cb753f87f5
canonical_url
https://medium.com/@s97172634/domain-model-%E8%88%87-data-model-f3cb753f87f5
author_url
https://medium.com/@s97172634
status
ok
fetched_at
2026-08-10 05:06:00