副标题 / 摘要
Active Record 把数据与持久化绑定在一起,Data Mapper 把持久化隔离为独立层。本文对比二者并给出选型建议。
目标读者
- 使用 ORM 的后端工程师
- 设计领域模型的开发者
- 需要做架构取舍的团队
背景 / 动机
项目变复杂时,持久化模型往往开始“侵入”业务逻辑。
理解 Active Record 与 Data Mapper 的差异,是避免架构污染的关键。
核心概念
- Active Record:对象自己保存/加载(数据与持久化耦合)
- Data Mapper:持久化逻辑在独立映射层
- 领域模型纯度:业务模型是否被 ORM 污染
实践指南 / 步骤
- 小型项目可用 Active Record
- 复杂领域建议 Data Mapper
- 明确领域边界,避免 ORM 侵入
- 用 Repository 隔离持久化
- 测试业务逻辑时替换存储层
可运行示例
# Active Record 风格
class UserAR:
def __init__(self, name):
self.name = name
def save(self):
print("save", self.name)
# Data Mapper 风格
class User:
def __init__(self, name):
self.name = name
class UserMapper:
def save(self, user: User):
print("save", user.name)
if __name__ == "__main__":
UserAR("Alice").save()
UserMapper().save(User("Bob"))
解释与原理
Active Record 简单直观,但把持久化耦合进领域模型。
Data Mapper 更复杂,但让业务逻辑更纯粹、更易测试。
常见问题与注意事项
Active Record 适合大项目吗?
通常不适合,耦合过深。Data Mapper 会不会太重?
会增加复杂度,但更利于长期维护。可以混用吗?
可以,但要有清晰边界。
最佳实践与建议
- 早期快速交付可用 Active Record
- 复杂业务优先 Data Mapper + Repository
- 避免 ORM 方法侵入领域模型
小结 / 结论
Active Record 简单但耦合高,Data Mapper 复杂但可维护性好。
选择取决于业务复杂度与演进需求。
参考与延伸阅读
- Patterns of Enterprise Application Architecture
- Martin Fowler: Active Record / Data Mapper
元信息
- 阅读时长:7~9 分钟
- 标签:Active Record、Data Mapper、ORM
- SEO 关键词:Active Record, Data Mapper
- 元描述:对比两种持久化模式并给出选型建议。
行动号召(CTA)
评估一次你的领域模型是否被 ORM 侵入,必要时引入 Repository。