DAO vs Active Record vs Data Mapper паттерны при работе с базой данных

В популярных фреймворках для работы с базой данных, как правило, используется ORM, которая представляет собой вспомогательную прослойку между приложением и базой данных.

В зависимости от фреймворка, ORM может реализовывать паттерн Active Record (например, framework kohana, Yii) или Data Mapper (например, doctrine в symfony). ORM фреймворка также может реализовывать другой паттерн или гибрид.

ORM  Object Relational Mapping. Говоря самым простым языком, ряды из таблиц в базе данных, будут представлены в виде объектов, проперти которых соответствуют именам полей из таблиц, а значения пропертей объекта - значениям из базы данных. Одна строка в базе данных - один объект.

Итак, идем от более простого к более сложному: DAO -> Active Record -> Data Mapper.

Паттерн DAO

Используется в библиотеке DBSimple.

DAO (Data Access Object) - объект, который предоставляет абстрактный интерфейс к базе данных. Главной идеей DAO является сделать возможным определенные операции с данными не вдаваюсь в детали реализации базы данных.

При использовании DAO - функции для работы c конкретной таблицей хранятся в файле модели. Модель (таблица) наследует абстрактный класс, реализующий DAO.

При получение ряда в DAO - в результирующем объекте или массиве будут содержаться все поля из базы данных. Пример:

$user = TableUser::me()->fetchRowById($userId);

В переменной $user будет объект либо массив в зависимости от реализации, содержащий все поля из таблицы "user". Класс TableUser будет содержать все методы, которые работают с таблицей "user". Дополнительный класс репозитория тут не нужен. Почему? Если для получения данных создать класс репозиторий, то в модели (таблице) останется буквально единственный метод получения имени таблицы.

Для обновления данных в DAO - используются отдельные методы, реализующие прямые sql-запросы, в отличие от Active Record где меняется состояние модели и вызывается save() для персиста состояния в базу данных.

Паттерн Active Record

Используется в Kohana, Yii.

Это шаблон проектирования или один из слоев приложения, который несет ответственность за представление бизнес-логики и данных. Active Record позволяет создавать и использовать более просто те объекты, который требуют постоянного хранения в базе данных. Если говорить в отношении MVC, то Active Record реализует первую букву М - то есть модель.

Очень простой пример использования модели, реализующей паттерн Active Record в php:

$user = new User();
$user->name = 'name';
$user->email = 'email@dot.com';
$user->save();

Этот код вызовет генерацию такого sql-запроса:

INSERT INTO user (name, email) VALUES ('name', 'email@dot.com');

Как правило, внутри модели, которая реализует Active Record, прописаны property. В данном случае в модели User должны быть представлены как минимум property name, email. Содержимое класса User:

<?php

class User extends \PDOMySQLModel
{
    public $user_id;

    public $name;

    public $email;

    public function getTableName()
    {
        return 'user'; 
    }
}

Проперти, как правило, делают публичными, как в примере выше. Но, проперти модели могут быть и приватными, тогда отдельно создают сеттеры и геттеры под каждый проперти.

Как правило, Active Record Модель - это маппинг полей модели на поля в базе данных. В Active record сама модель отвечает за сохранение данных в базу данных. А это означает, что нарушется первый принцип из SOLID - принцип единственности ответственности. Класс отвечает не только за представление данных, но и за сохранение.

Паттерн Data Mapper

Используется в Hibernate в Java и в Doctrine2 в php, так в CycleOrm.

Data Mapper - это слой доступа к данным, который предоставляет двунаправленный маппинг данных между постоянным хранилищем данных (обычно, это sql база данных) и хранением данных в памяти (например, на время выполнениния php скрипта).

В отличие от Active Record, в Data Mapper появляется еще один слой или тип сущности такой как entityManager. Именно этот слой будет отвечать за перенос состояния модели в базу данных и обратно.

 
Поисковые запросы, по которым приходили пользователи
 
 
 

icon Комментарии 0

Ваш комментарий к статье.. (для авторизованных)

ctrl+enter

icon Вход в систему

зарегистрироваться
НОВЫЕ ПОЛЬЗОВАТЕЛИ