区别在于你的领域对象与数据访问层之间的分离程度。使用ActiveRecord时,它们是一个对象,这使得它非常简单。特别是如果你的类与数据库一一对应。数据映射器更加灵活,并且可以轻松地使你的领域独立于任何数据访问基础设施代码进行测试。但复杂性是有代价的。
class Post
include DataMapper::Resource
property :id, Serial
property :title, String
property :body, Text
property :created_at, DateTime
end
在ActiveRecord中,类大多是一个空类,框架会扫描数据库。这意味着您需要预定义数据库或使用类似迁移的工具来生成模式,以将数据模型与ORM分离。
DataMapper.auto_migrate!
会为您生成模式。
在这方面,ActiveRecord有所不同:
class Post < ActiveRecord::Base
end
我必须承认,我不知道doctrine或Xyster,但至少我可以给出一些关于Ruby中Active Records与SubSonic、Linq to SQL、nHibernate和Telerik等ORM之间差异的见解。希望这能让你有所发现。
Ruby的Active Record是其本地数据访问库 - 它不是从现有SQL接口库(例如.NET SqlDataTables)映射到语言结构的库 - 它就是接口库。这使设计者更有自由度以更集成的方式构建库,但也需要他们实现广泛的SQL工具,这些工具通常在ORM中找不到(例如DDL命令是Ruby的Active Record接口的一部分)。
ORM(对象关系映射)是通过手动步骤将其映射到底层数据库结构的,其中代码生成器将打开数据库并扫描其中的表格(和存储过程) - 构建与之对应的对象。这些对象使用语言提供的低级SQL编程构造(例如.NET System.Data.Sql和SqlClient库)构建。目标是在编程时为面向记录的关系型数据库提供更流畅的接口,以减少关系模型和面向对象编程之间的“阻抗不匹配”。
顺便说一句,微软已经采取了非常类似于Active Record的步骤,通过Linq to SQL和Linq to Entities将本地语言构造集成到C#中。
希望这可以帮助你!