В чем разница между ORM, AR, QB и DM? - PullRequest
5 голосов
/ 19 июня 2009

Хорошо, так что все решили (и не без оснований), что прямой SQL - от дьявола. Это оставляет нам много способов размещения «посредника» в нашем коде для отделения нашего кода от базы данных. Теперь я собираюсь выкладывать всю информацию, которую я собрал, в надежде, что кто-то может заставить меня выйти из строя и рассказать мне, что я построил.

ORM (объектно-реляционное отображение) - это набор инструментов (слабо или тесно связанных друг с другом), которые отображают строки базы данных в объекты приложения.

В AR (Active-Record) - это тип ORM, в котором таблица или представление базы данных заключено в класс, поэтому экземпляр объекта привязан к одной строке в таблице.

Отображение данных (DM) - это тип ORM, который представляет собой процесс создания отображений элементов данных между двумя различными моделями данных.

Все три утверждают, что работают так:

$user = new User();
$user->name = 'Fred';
$user->save();

Обычно с классом User что-то вроде этого:

class User extends Model {
    // Specify the database table
    protected $table = "users";

    // Define your fields
    protected $fields = array(
        'id' => array('type' => 'int', 'primary' => true),
        'name' => array('type' => 'string', 'required' => true),
        'email' => array('type' => 'text', 'required' => true)
    );
}

С этой настройкой вы можете легко извлекать строки без необходимости писать SQL.

// users
$users = $user->fetch(array('id' => 3));

Некоторые классы AR на самом деле выглядят так:

$db->where('id' => 3);
$db->join('posts', 'posts.user_id = users.id');
$results = $db->get('users');

Хорошо, теперь это место, где становится волосатым. Кажется, что у каждого и его брата разные взгляды на то, какой тип кода падает. Хотя большинство согласны с тем, что AR или DM - это тип ORM, но иногда линии, которые сообщают AR от DM, кажутся размытыми.

Я написал класс, который использует один объект ($ db), в котором вы делаете вызовы для этого объекта, и он обрабатывает создание SQL для сохранения / извлечения результатов.

//Fetch the users
$results = $db->select('id, name')->where('id > 4')->get('users');

//Set them active
while($user = $results->fetch()) {
    $user->active = TRUE;
    $user->save();
}

Итак, вопрос «что это?», И почему люди не соглашаются с этими условиями?

Ответы [ 3 ]

5 голосов
/ 25 августа 2009

Дело не в том, что прямой SQL - это дьявол - иногда в значительной степени требуется написать сырой SQL, чтобы запрос выполнялся так, как вы этого хотите. Для меня ORM - это больше, чем просто устранение ручной работы (например, отказ от SQL любой ценой). Я просто не хочу настраивать все мои объекты кода со всеми сделанными вручную запросами для каждого проекта. Это просто нелепое количество работы и мыслей. Вместо этого инструменты ORM предоставляют хороший и автоматизированный способ создания объектов данных, которые в противном случае потребовали бы много ручной работы. Теперь у меня могут быть автоматические отдельные объекты строк, для которых я могу расширять и создавать собственные функции, не задумываясь об этом. Я могу получить связанные строки из разных таблиц без необходимости вручную кодировать этот запрос.

Похоже, ваш пример класса User взят из phpDataMapper , и, если это так, он также имеет некоторые другие встроенные тонкости, такие как автоматическая миграция таблиц, поэтому вам не нужно распространять файл SQL для вашего структуры таблиц, а также несколько вспомогательных функций и многое другое. Все включенные функции предназначены для экономии вашего времени - вот основная цель.

Самое важное различие между AR и DM заключается в том, что строка ActiveRecord (AR) знает о своем собственном хранилище данных и, таким образом, имеет функции сохранения / обновления для каждого объекта строки - $ user-> save () - «запись» является "активным". С другой стороны, с помощью DataMapper (DM) каждая отдельная строка НЕ ​​знает о своем собственном хранилище данных по определению. Строка - это скорее объект тупого значения, с которым можно работать в вашем коде. Mapper отвечает за перевод изменений этой строки обратно в хранилище данных - $ mapper-> save ($ user). Это самое существенное отличие - вы обнаружите, что большинство основных функций ORM одинаковы практически в любой реализации. Это в основном вопрос того, как это собрать на базовом архитектурном уровне.

4 голосов
/ 19 июня 2009

Вы также можете составить аббревиатуры ORM, RM DM, как угодно ... это всего лишь состояние , перенесенное с одного носителя на другое и заключенное в функцию / семантику.

Sun Microsystems и Microsoft делают это постоянно с Java и C #. Давайте возьмем что-то простое и дадим ему новое имя! Какая прекрасная идея.

Если вы говорите ОРМ .. все знают, что это такое, во многих его проявлениях. Ваш код выглядит как материал Linq.

Никакой магии, но много модных слов и суеты ИМХО.

0 голосов
/ 19 июня 2009

Договорились с Эйденом Беллом. Но я думаю, что вы правы, указывая на различия. Я использую LINQ to SQL, который в вашем определении - просто стиль Active-Record ORM. Для меня это прекрасно работает, так как я работаю над множеством новых приложений и начинаю с БД, чтобы строить свои классы. Оттуда я стремлюсь следовать подходу доменного управления (я знаю ... это концепция классов), работая с сгенерированными классами. Для меня это быстро приводит меня в движение.

Сказав это, я также работал с Entity Framework и NHybernate. Entity Framework - это средство отображения данных UBER, а NHybernate - это средство отображения данных, но без особой сложности! Я лично чувствую, что Entity Framework еще предстоит пройти долгий путь. Если бы мне когда-нибудь понадобилось больше сложности, например, в приложении «коричневого поля», в котором база данных была бы точно установлена, и мне нужно было, чтобы мои классы представляли мое приложение, а не базу данных, тогда я бы предпочел перейти к чему-то более похожему на NHybernate и его функциональность отображения данных.

Я думаю, что каждый из этих инструментов имеет свое место. Нечестно сказать, что они все такие же, как и они. Активная запись хороша тем, что она генерирует для меня классы, которые непосредственно представляют мою базу данных. Это работает, когда я создал базу данных или базу данных, которая в точности соответствует моим повсеместным терминам и концепциям приложения. Типы сопоставления форм работают, когда у меня есть фиксированная база данных, которая не имеет смысла или не имеет четкого соответствия с моим приложением, и в этом случае я могу инкапсулировать сложность или ее отсутствие в моей базе данных, чтобы создать богатый домен с помощью функций сопоставления Инструмент ORM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...