Чистый SQL, Yii Active Record или Mixed - PullRequest
4 голосов
/ 23 марта 2011

Попытка разобраться в преимуществах или недостатках различных подходов. На самом деле не ищет мнения, скорее, что эти различные подходы обеспечивают или ограничивают.

Yii утверждает, что использование их AR упрощает программирование БД, но меня больше волнует «зашивка» БД с моим кодом. Я, очевидно, знаю, что они работают вместе, но картирование вызывает беспокойство. Я хочу, чтобы в БД существовало как можно больше элементов управления и ограничений, и мне интересно, может ли отказ от чистого SQL в любом случае ограничить производительность.

Ответы [ 2 ]

5 голосов
/ 23 марта 2011

ActiveRecord подходит для любой системы с довольно простым ORM, где Model == Table, с отношением 1: 1. Другими словами, если все ваши объекты данных помещаются в отдельные таблицы (возможно, с несколькими дополнительными таблицами, связывающими их), ActiveRecord для вас. И вы, как правило, можете разработать свое программное обеспечение, чтобы это было так!

Но вы правы, это немного «мешает» реализацию БД и немного кодирует. предполагается, , что Model == Table, что означает, что реализация базы данных НЕ отделена от вашего кода. ActiveRecord немного ломается, если у вас есть сложные модели, хранящиеся в нескольких таблицах. Но это довольно сложный аргумент Я не буду вдаваться. Другие шаблоны, такие как Data Mapper , обеспечивают большую гибкость, но изначально требуют больше работы для кодирования.

ActiveRecords - «установи и забудь». ТАК легко и быстро. Нет утомительного кодирования геттеров и сеттеров, просто красивые PHP-объекты, созданные из ваших таблиц. Недавно я создал довольно большое приложение на Yii, и мне нравится скорость и простота ActiveRecord. Сейчас я работаю над приложением в Zend, и хотя я вижу, как их путь дает вам больше контроля, я скучаю по простоте AR. ;)

3 голосов
/ 23 марта 2011

Yii ActiveRecord определенно упрощает программирование для базы данных, как, конечно, любая приличная реализация ActiveRecord.

Отображение в БД

Что касается отображения между базой данных и вашими моделями, то нет проблем с тем, что ваш код «захватит» вашу базу данных. Единственное, что вы заставляете постоянно поддерживать в актуальном состоянии, это:

/**
 * @return string the associated database table name
 */
public function tableName()
{
    return 'my_table';
}

Видеть, как имена таблиц не будут меняться так часто, это не практическая проблема.

Существуют другие части ваших моделей ActiveRecord, которые должны синхронизироваться с вашей схемой:

  • Комментарии phpdoc, описывающие свойства класса модели
  • Другие общедоступные функции, которые реализуют различные функциональные возможности, такие как правила проверки [public function rules()], внешние связи модели [public function relations()], метки атрибута [public function attributeLabels()] и т. Д.

Однако вы все равно можете использовать модели и саму базу данных, даже если они не отражают вашу текущую схему базы данных - просто соответствующие функциональные элементы больше не будут работать.

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

Производительность

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

Конечно, будут некоторые издержки от использования самого компоновщика запросов, но это компромисс, который выбрали почти все современные языки программирования (LINQ был бы самым массовым примером здесь), потому что оно того стоит. * * 1039

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

...