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

什么';活动记录和基于数据映射器的ORM之间的显著差异是什么?,orm,activerecord,datamapper,Orm,Activerecord,Datamapper,与doctrine(活动记录)和Xyster(数据映射器)一样,有什么区别?区别在于域对象与数据访问层的分离程度。对于ActiveRecord,它是一个对象,这使得它非常简单。尤其是当类将一对一映射到数据库时。 Data mapper更加灵活,可以轻松地让您的域独立于任何数据访问基础架构代码进行测试。但是复杂性是要付出代价的。我不得不承认我不知道doctrine或Xyster,但我至少可以对Ruby中实现的活动记录与ORMs(如亚音速、Linq to SQL、nHibernate和Telerik

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

区别在于域对象与数据访问层的分离程度。对于ActiveRecord,它是一个对象,这使得它非常简单。尤其是当类将一对一映射到数据库时。
Data mapper更加灵活,可以轻松地让您的域独立于任何数据访问基础架构代码进行测试。但是复杂性是要付出代价的。

我不得不承认我不知道doctrine或Xyster,但我至少可以对Ruby中实现的活动记录与ORMs(如亚音速、Linq to SQL、nHibernate和Telerik)之间的区别给出一些见解。希望它至少能给你一些可以进一步探索的东西

Ruby的活动记录是其本机数据访问库-它不是从现有SQL接口库(例如.NET SqlDataTables)到语言结构的映射-它是接口库。这给了设计人员更大的空间以更集成的方式构建库,但也要求他们实现一系列在ORM中通常找不到的SQL工具(例如DDL命令是Ruby活动记录接口的一部分)

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

作为旁注,MS在通过Linq to SQL和Linq to Entities将本机语言构造构建到C#中时采取了一个非常“活动记录式”的步骤


希望这有帮助

主要区别在于,在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
class Post
在DataMapper中,不需要迁移,因为自动迁移可以生成模式或查看模型与数据库之间的差异,并为您进行迁移。还支持手动迁移,您可以将其用于非常见情况

此外,DataMapper对“ruby”语法友好得多,而且在执行可链接条件时延迟加载(如Rails 3中的ActiveRecord)等功能从一开始就存在

Datamapper还有一个特性,即数据库中的每个记录都映射到一个ruby对象,这对于ActiveRecord是不正确的。因此,如果您知道数据库记录是相同的,那么您就知道对ruby对象的两个引用也将指向同一个对象

另一方面,虽然Rails 3可能会向您承诺可交换的框架,但Datamapper railtie(dm Rails)还没有做好生产准备,许多功能可能无法工作


更多信息请参见此页。

正如blockhead所说,区别在于如何选择将域对象与数据访问层分离

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

这里,一个对象=一条记录

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

在这里,一个对象不必是一条记录

之所以采用这种方式,是因为这种模式的目标是:保持内存中的表示和持久数据存储相互独立,并使数据映射器本身独立

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

欢迎对我的答案提出任何建议/更正,以防我在某个地方出错