基于活动记录和数据映射器的ORM之间的显着差异是什么?

时间:2010-03-10 03:18:08

标签: orm activerecord datamapper

与教义(活跃记录)和Xyster(数据映射器)一样,有什么区别?

4 个答案:

答案 0 :(得分:3)

区别在于您的域对象与数据访问层的区别。使用ActiveRecord,它的所有一个对象,这使它非常简单。特别是如果您的类一对一地映射到您的数据库。 数据映射器更加灵活,可以轻松地对您的域进行独立于任何数据访问基础架构代码的测试。但复杂性是有代价的。

答案 1 :(得分:2)

就像blockhead所说,区别在于你如何选择将Domain Objects与数据访问层分开。

简而言之,活动“记录”将对象映射到数据库中的记录。

此处,One Object = One Record。

据我所知,数据“mapper”使用数据映射对象,但它不必是记录 - 它也可以是文件。

此处,One Object不必是One Record

就是这样,因为这种模式的目标是:保持内存表示和持久数据存储彼此独立以及数据映射器本身。

通过不放置此1 object = 1记录限制,Data Mapper使这两个层彼此独立。

如果我在某个地方出错,欢迎对我的回答提出任何建议/更正。

答案 2 :(得分:1)

主要的区别在于,在DataMapper中,模型是在ruby类本身中定义的:

class Post
  include DataMapper::Resource

  property :id,         Serial
  property :title,      String
  property :body,       Text
  property :created_at, DateTime
end

在ActiveRecord中,类主要是一个空类,而framwork会扫描数据库。这意味着您需要预先定义的数据库或使用迁移等方式生成模式,这样可以将数据模型与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

答案 3 :(得分:0)

我必须承认我不知道 doctrine Xyster 但我至少可以深入了解Ruby与ORM中实现的Active Records之间的区别例如SubSonic,Linq to SQL,nHibernate和Telerik。希望它至少会给你一些进一步探索的东西。

Ruby的Active Record是它的 native 数据访问库 - 它不是从现有SQL接口库(例如.NET SqlDataTables)到该语言结构的映射 - 它是< / em>接口库。这使设计人员能够以更加集成的方式构建库,但是它还要求他们实现通常在ORM中找不到的各种SQL工具(例如,DDL命令是Ruby的Active Record接口的一部分) )。

ORM通过手动步骤映射到底层数据库结构,其中代码生成器将打开数据库并对其进行扫描 - 构建与其找到的表(和存储过程)对应的对象。这些对象是使用作为语言一部分提供的低级SQL编程结构构建的(例如.NET System.Data.Sql和SqlClient库)。这里的目标是在编程时为面向记录的关系数据库提供更平滑,更流畅的界面:减少关系模型和面向对象编程之间的“阻碍不匹配”。

作为旁注,MS通过Linq to SQL和Linq to Entities在C#中构建本地语言结构,采取了非常“类似Active Record”的步骤。

希望这有帮助!