Решил написать проект (учебный) на laravel. И так как это известный фреймворк естественно посмотрел как он устроен. Конкретно интересовала реализация механизма:
Сейчас меня интересует общий вопрос по базам данных.
Посмотрев пару фалов реализации работы с базой данных для себя понял следуюющее:
в файле конфигурации хранятся данные для подключения к базе данных; и выбрано драйвер.
так как реализована поддержка множества известный бд, то и написаны классы которые выполняют подключение ( возвращают объект PDO) с учетом специфики каждой бд (MySQLi - файл ; MySQL - сокет / удалено) и т.д.
после чего реализован общий интерфейс работы с бд ( общая грамматика SQL ), соответственно и реализован этот интерфейс для каждой бд с учетом их специфики работы. ( поддержка транзакций и т.д. )
Сам принцип взаимодействия с бд построен по шаблону ActiveRecords, с этим ясно так так такой принцип и в других фреймворках ( тот же Yii ).
После чего у меня возник вопрос: если на каждую таблицу создана модель, то как тогда делать сложные запросы? ( запросы с подзапросами, соединение таблиц и т.д.).
Посмотрев документацию Laravel нашел ответ на свой вопрос здесь.
Бегло посмотрев примеры кода, опять таки видно что есть класс обвертка который по сути занимается тем, что генерирует sql.
Если что-то понял не так, пожалуйста исправте, именно для этого и создан этот вопрос.
И на основе всего выше сказанного сами вопросы:
В чем преимущество использования ActiveRecords кроме того, что каждое свойство объекта соответствует названию столбца в таблице бд?
Есть множество книг по оптимизации работы баз данных ( к примеру Шварц Б., Зайцев П., Ткаченко В. и др. - MySQL. Оптимизация производительности), по SQL в которых тоже есть много "умного" по правильной работе с тем же NULL т.д, нормальные формы бд... Тогда почему не пишут SQL? Не спорю удобно написать один раз код где-то и потом использовать везде, но что насчет оптимизации?
У каждой бд своя специфика работы, поддержка как стандартизированных функций так и нет ( тот же MySQL). Опять таки написано уйму книг по их настройке и оптимизации. Тогда правильно ли все сводить к одному общему интерфейсу? Как по мне тогда нет никакого смысла использовать что-то лучше чем MySQLi для блога и MySQL для крупного проекта. (Имею введу поддержку Oracle бд, это мощная бд, ресурсоемкая, но ее использовать будут для вставки и обновления)
ActiveRecords
- это ORM
.
Преимущества отсюда очевидные:
1) Независимость от СУБД. (т.е. если БД у вас сменится на тот-же постгрю, то не надо будет переписывать).
2) ООП подохд.
3) Связи, валидация, удобство работы и куча других мелочей.
Недостатки офк тоже есть:
Если опустить всякие аргументы типа, больше времени нужно, памяти и т.д. то главный минус это то, что паттерн нарушает некоторые другие, например: Принцип единственной ответственности
. Так-же могут быть лишние запросы, но это уже второстепенное.
P.S.:
В принципе вы все описали. Так работает ActiveRecord
, в целом, он удобен при разработке. Про оптимизацию нечего сказать ибо ничего конкретного вы не спросили, ActiveRecord
, как и любая ORM
не гарантирует оптимальность SQL
-запроса но 99%
зависит именно от вас. От того как вы составите запрос с помощью ActiveRecord
и настроите БД.
P.S.2:
Если вам не нравится ActiveRecord
используйте DataMapper
. Надо понимать, что Laravel
хочет стандартизировать свои проекты, а за любым стандартом кроется куча камней и минусов (всем не угодишь). Для очень нагруженных сайтов, возможно ORM
не используется, но чтобы так нагрузить, надо еще постараться.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Каким образом можно подставить знак ; между переменной в php , которая формируется подстановкой из URI:
Возможно тема вопроса старая, и множество ответов на нее естьВ общем, при компилировании проектов с github при попытке установки все происходит...