像学说(活动记录)和Xyster(数据映射器),有什么区别?
4 回答
不同之处在于域对象与数据访问层的分离程度。使用 ActiveRecord,它是一个对象,这使得它非常简单。特别是如果您的类一对一映射到您的数据库。数据映射器更加灵活,并且可以轻松地让您的域独立于任何数据访问基础架构代码进行测试。但复杂性是有代价的。
就像傻瓜所说,不同之处在于您如何选择将域对象与数据访问层分开。
简而言之,活动“记录”将对象映射到数据库中的记录。
在这里,一个对象 = 一个记录。
据我所知,Data“mapper”用数据映射一个对象,但它不一定是记录——它也可以是一个文件。
在这里,一个对象不必是一个记录
之所以采用这种方式是因为这种模式的目标是:保持内存中的表示和持久数据存储彼此独立以及数据映射器本身。
通过不设置 1 个对象 = 1 个记录的限制,Data Mapper 使这两个层彼此独立。
欢迎对我的回答提出任何建议/更正,以防我在某处出错。
主要区别在于,在 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) 还没有准备好生产,并且许多功能可能无法工作。
请参阅此页面了解更多信息。
我不得不承认我不知道教义或Xyster,但我至少可以深入了解在 Ruby 中实现的 Active Record 与 SubSonic、Linq to SQL、nHibernate 和 Telerik 等 ORM 之间的区别。希望它至少能给你一些进一步探索的东西。
Ruby 的 Active Record 是它的原生数据访问库——它不是从现有 SQL 接口库(例如 .NET SqlDataTables)到语言结构的映射——它是接口库。这给了设计人员以更集成的方式构建库的更多自由,但也要求他们实现在 ORM 中通常找不到的广泛的 SQL 工具(例如,DDL 命令是 Ruby 的 Active Record 接口的一部分)。
使用手动步骤将ORM映射到底层数据库结构,其中代码生成器将打开数据库并扫描它 - 构建与它找到的表(和存储过程)相对应的对象。这些对象是使用作为语言一部分提供的低级 SQL 编程结构(例如 .NET System.Data.Sql 和 SqlClient 库)构建的。这里的目标是在您进行编程时为面向记录的关系数据库提供更流畅、更流畅的界面:减少关系模型和面向对象编程之间的“阻抗不匹配”。
附带说明一下,MS 在通过 Linq to SQL 和 Linq to Entities 将本地语言结构构建到 C# 方面采取了非常“类似于 Active Record”的步骤。
希望这可以帮助!