Bite code 2018-02-19
简介
对象关系映射(Object-Relational Mapping,简称 ORM)是一种技术,它允许你使用面向对象的编程范式来查询和操作数据库中的数据。当我们谈论 ORM 时,大多数人实际上指的是一个实现了对象关系映射技术的库,因此我们常说“一个 ORM”。
ORM 库就是用你所选择的编程语言编写的一个普通库,它封装了操作数据所需的代码,因此你不再需要直接写 SQL;而是可以直接与你所用编程语言中的对象进行交互。
举个完全虚构的例子,假设使用某种伪语言:
你有一个 Book(书籍)类,你想获取所有作者为 “Linus” 的书籍。手动操作时,你可能会这样写:
book_list = new List();
sql = "SELECT book FROM library WHERE author = 'Linus'";
data = query(sql); // 这里做了极大简化……
while (row = data.next()) {
book = new Book();
book.setAuthor(row.get('author'));
book_list.add(book);
}
而使用 ORM 库后,代码会变成这样:
book_list = BookTable.query(author="Linus");
所有机械性的操作都由 ORM 库自动完成。
优缺点
使用 ORM 的优点
- DRY 原则(Don’t Repeat Yourself):你只需在一个地方定义数据模型,代码更易于更新、维护和复用。
- 自动化程度高:从数据库连接管理到国际化(I18N)等大量工作都自动完成。
- 促进 MVC 架构:ORM 强制你采用 MVC(模型-视图-控制器)结构,最终使代码更加清晰。
- 避免手写糟糕的 SQL:大多数 Web 程序员并不擅长 SQL(常被当作“次级语言”对待),而实际上 SQL 是一门强大且复杂的语言。
- 安全性更高:使用预处理语句(prepared statements)或事务(transactions)就像调用一个方法一样简单。
使用 ORM 的灵活性
- 符合自然编码习惯:你使用的是自己熟悉的编程语言。
- 数据库抽象化:你可以随时更换底层数据库系统。
- 模型解耦:数据模型与应用程序其余部分松散耦合,便于在其他地方复用或修改。
- 支持面向对象特性:例如数据继承等 OOP 特性可以轻松实现,无需额外复杂逻辑。
ORM 的缺点
- 学习成本高:你需要花时间学习 ORM,而且 ORM 库通常不是轻量级工具。
- 配置复杂:设置 ORM 本身可能比较繁琐。
- 性能问题:对于常规查询,ORM 性能尚可;但在大型项目中,SQL 高手手写的 SQL 通常更高效。
- 过度抽象的风险:如果你不了解 ORM 背后的机制,很容易写出低效甚至灾难性的代码(例如在循环中频繁查询数据库)。
如何学习 ORM?
最好的方法就是动手使用一个 ORM。无论你选择哪个 ORM 库,它们的基本原理都是相通的。以下是一些主流语言中常用的 ORM 库:
- Java:Hibernate
- PHP:Propel 或 Doctrine(我个人更喜欢后者)
- Python:Django ORM 或 SQLAlchemy(我最喜欢的 ORM 库)
- C#:NHibernate 或 Entity Framework
如果你想在 Web 开发中尝试 ORM,建议直接使用集成了 ORM 的完整框架,例如:
- Symfony(PHP,支持 Propel 或 Doctrine)
- Django(Python,内置 ORM)
除非你是为了学习原理,否则不要尝试自己编写 ORM。这是一个极其庞大的工程,现有的成熟 ORM 库都经历了长时间的开发和优化才变得可靠。