Является ли Data Mapper более современной тенденцией, чем Active Record

Я столкнулся с несколькими ORM, которые недавно объявили, что планируют перенести их реализацию с Active Record на Data Mapper. Мои знания об этой теме очень ограничены. Итак, вопрос для тех, кто знает лучше, - это Data Mapper более новый, чем Active Record? Было ли это во время движения Active Record? Как эти два связаны друг с другом?

Наконец, поскольку я не являюсь человеком базы данных и мало знаю об этом предмете, должен ли я следовать ORM, который переходит к реализации Data Mapper, как в том, что в нем для меня, как для кого-то, пишущего программное обеспечение (а не для человека данных)?

Ответ 1

DataMapper не является более современным или более новым, но более подходит для ORM.

Основная причина, по которой люди меняются, заключается в том, что ActiveRecord не делает хороший ORM. AR обертывает строку в таблице базы данных или представлении, инкапсулирует доступ к базе данных и добавляет логику домена к этим данным. Таким образом, по определению AR представляет собой представление записи базы данных 1:1, что делает его особенно подходящим для простого CRUD.

Некоторые AR добавили выборку связанных данных, что заставило людей полагать, что AR является ORM. Это не. Точка ORM - это устранение несоответствия реляционного импеданса объекта между вашей структурой базы данных и объектами домена. При использовании AR вы не решаете это несоответствие импеданса, потому что ваш AR представляет собой строку базы данных, а не правильную конструкцию OO. Вы привязываете свой db-макет к своим объектам. Некоторые из объектно-реляционных поведенческих моделей все еще могут применяться (например, ленивая загрузка).

Другая причина, по которой AR часто критикуется, заключается в том, что она включает в себя две проблемы: логика бизнес-логики и логика доступа к базе данных. Это приводит к нежелательному соединению и может привести к меньшей ремонтопригодности и гибкости в более крупных приложениях. Между двумя слоями нет изоляции. Сцепление всегда приводит к меньшей гибкости.

DataMapper, с другой стороны, перемещает данные между объектами и базой данных, сохраняя их независимо друг от друга и самого транслятора. Хотя это сложнее реализовать, это позволяет использовать гораздо более гибкий дизайн в вашем приложении. Ваши объекты домена больше не должны соответствовать структуре db. DAL и уровень домена разделены.

Ответ 2

мои 2 цента:

DataMapper новее, чем ActiveRecord. Мне больше нравится синтаксис DataMapper; он более явный и менее "волшебный". Я мог бы объяснить больше причин, но они перечислены здесь: http://datamapper.org/why

ActiveRecord имеет гораздо больше документации.

Ответ 3

Несмотря на то, что должность 8 лет, вопрос остается в силе в 2018 году.

Активная запись - это Anti-шаблон, остерегайтесь этого. Это создает очень плотную связь между кодом и базой данных. Это может быть не проблема для небольших простых проектов. Тем не менее, я настоятельно рекомендую избегать использования его в чем-то большем.

Хороший дизайн ООП выполняется в слоях. Уровень ввода, уровень обслуживания, уровень репозитория, блок данных и БД - просто пример. Не следует смешивать входной уровень с БД. Как это можно сделать? Например, в Laravel вы можете использовать правило Validator следующим образом:

'email' => 'exists:staff,email'

Он проверяет, существует ли почта в штате таблицы. Это полный ООП, не имеющий смысла. Он затягивает ваш верхний слой с именем столбца DB. Я не могу представить лучшего примера плохого дизайна ООП.

Суть - если вы создаете простой сайт с 2-3 таблицами, например, в блоге, Active record может не быть проблемой. Для чего-нибудь большего, перейдите для Data Mapper и будьте осторожны с принципами OOP, такими как IoC, SoC и т.д.