Какая значительная разница между активными записями и ORM на основе отображения данных? - PullRequest
7 голосов
/ 10 марта 2010

Как доктрина (активная запись) и Xyster (преобразователь данных), в чем разница?

Ответы [ 4 ]

3 голосов
/ 10 марта 2010

Разница в том, насколько ваши доменные объекты отделены от слоя доступа к данным. С ActiveRecord, все это один объект, что делает его очень простым. Особенно, если ваши классы сопоставляют один к одному с вашей базой данных. Data Mapper более гибок и позволяет легко тестировать ваш домен независимо от кода инфраструктуры доступа к данным. Но сложность имеет свою цену.

2 голосов
/ 05 июня 2013

Как сказал болван, разница заключается в том, как вы решаете отделить доменные объекты от уровня доступа к данным.

В двух словах: Активная "Запись" сопоставляет объект с записью в базе данных.

Здесь один объект = одна запись.

Из того, что я знаю, Data "mapper" отображает объект с данными, но это не обязательно должна быть запись - это может быть и файл.

Здесь Один объект не обязательно должен быть одной записью

Это так, потому что цель этого шаблона: , чтобы представление в памяти и постоянное хранилище данных были независимыми друг от друга и от самого преобразователя данных. Не устанавливая ограничение 1 запись = 1 запись, Data Mapper делает эти два слоя независимыми друг от друга.

Любые предложения / исправления к моему ответу приветствуются, если я где-то ошибся.

1 голос
/ 21 апреля 2010

Основное отличие состоит в том, что в 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», и такие функции, как отложенная загрузка при выполнении условий с цепочкой (например, ActiveRecord в Rails 3), присутствуют с самого начала.

Datamapper также имеет функцию, заключающуюся в том, что каждая запись в базе данных отображается на один объект ruby, что неверно для ActiveRecord. Поэтому, если вы знаете, что записи в базе данных совпадают, вы знаете, что две ссылки на объект ruby ​​также будут указывать на один и тот же объект.

С другой стороны, в то время как Rails 3 может пообещать вам сменные платформы, Datamapper railtie (dm-rails) не готов к работе, и многие функции могут не работать.

См. страницу для получения дополнительной информации.

0 голосов
/ 10 марта 2010

Я должен признать, что я не знаю доктрину или Xyster , но я могу, по крайней мере, дать некоторое представление о разнице между активными записями, реализованными в Ruby, и ORM, такими как SubSonic, Linq to SQL, nHibernate и Telerik. Надеюсь, это, по крайней мере, даст вам кое-что для дальнейшего изучения.

Active Record Ruby - это нативная библиотека доступа к данным - это не отображение из существующей библиотеки интерфейса SQL (например, .NET SqlDataTables) в конструкции языка - это - интерфейс библиотеки. Это дало разработчикам больше возможностей для создания библиотеки более интегрированным образом, но также потребовало, чтобы они реализовали широкий спектр инструментов SQL, которые вы обычно не найдете в ORM (например, команды DDL являются частью интерфейса Active Record Ruby). ).

ORM сопоставляются с базовой структурой базы данных с помощью ручного шага, на котором генератор кода открывает базу данных и просматривает ее, создавая объекты, соответствующие таблицам (и хранимым процедурам), которые она находит. Эти объекты создаются с использованием низкоуровневых конструкций программирования SQL, предлагаемых как часть языка (например, библиотеки .NET System.Data.Sql и SqlClient). Цель здесь - дать реляционным базам данных, ориентированным на записи, более плавный и плавный интерфейс во время программирования: уменьшить «несоответствие импеданса» между реляционной моделью и объектно-ориентированным программированием.

В качестве дополнительного примечания, MS сделала очень «подобный Active Record» шаг в построении конструкций на родном языке в C # через Linq для SQL и Linq для Entities.

Надеюсь, это поможет!

...