基于Active Record和Data Mapper的ORM之间有哪些重大区别?

9
像Doctrine(Active Record)和Xyster(Data Mapper)这样的技术,它们有什么区别?
4个回答

4
就像blockhead所说的那样,区别在于你选择如何将领域对象与数据访问层分离。
简而言之,“Active Record”将一个对象映射到数据库中的一条记录。
这里,一个对象等同于一条记录。
据我所知,“Data Mapper”将一个对象与数据进行映射,但它不必是一条记录——也可以是一个文件。
这里,一个对象不必等同于一条记录。
这样做的目的是为了使内存表示和持久化数据存储相互独立,并且与数据映射器本身也是独立的。
通过不设置1个对象=1个记录的限制,数据映射器使这两个层彼此独立。
如果我哪里错了,欢迎提出建议/更正。

3

区别在于你的领域对象与数据访问层之间的分离程度。使用ActiveRecord时,它们是一个对象,这使得它非常简单。特别是如果你的类与数据库一一对应。数据映射器更加灵活,并且可以轻松地使你的领域独立于任何数据访问基础设施代码进行测试。但复杂性是有代价的。


1
主要区别在于,在DataMapper中,模型是在Ruby类本身中定义的:
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

在DataMapper中,无需迁移,因为自动迁移可以生成模式或查看模型和数据库之间的差异并为您迁移。还支持手动迁移,可用于非平凡情况。
此外,DataMapper更加“ruby”语法友好,像Rails 3中的ActiveRecord一样进行链式条件时具有惰性加载等功能从一开始就存在。
Datamapper还具有一个特性,即数据库中的每个记录都映射到一个Ruby对象,这对于ActiveRecord来说并不是真实的。因此,如果您知道数据库记录相同,则知道对Ruby对象的两个引用也将指向同一个对象。
另一方面,虽然Rails 3可能承诺您可交换的框架,但Datamapper railtie(dm-rails)尚未准备就绪,许多功能可能无法正常工作。
有关更多信息,请参见page

0

我必须承认,我不知道doctrineXyster,但至少我可以给出一些关于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#中。

希望这可以帮助你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接