Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 07.01.2017 16:06:38

Чем хорош orm, если он делает много запросов?

День добрый!
Много сдесь на форуме читал о том, что в ларавеле делать сырые запросы - плохая практика. Используй orm, иначе нафига ты пишешь на фрейме? И я с этим согласен. Но! Сейчас вот сам столкнулся с тем, что на странице товара у меня больше 12 запросов, и это при том что я юзаю "with". Собственно привожу код:

$product = Product::with('images', 'brand', 'category', 'attributes', 'attributes.value', 'options', 'prices', 'vendors', 'vendors.offers', 'reviews', 'rating', 'videos', 'recomendations')->findSlug($slug);

Есть еще 2 скоупа которые считают самую низкую и высокую цену.
Так вот, сдесь получилось 15 запросов. К примеру в опенкарте всю эту инфу за 2 запроса берут.
И разве это нормально что 15 запросов идет?

Не в сети

#2 07.01.2017 17:11:00

Re: Чем хорош orm, если он делает много запросов?

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

Скинь сюда сырые запросы, которые создает Eloquent и Opencart, тогда будет понятно что к чему. И еще, есть возможность сравнить скорость выполнения запросов Eloquent и Opencart в одной и той же среде без кэширования? А еще, очень очень очень интересно посмотреть на код Opencart, который создает тотже запрос.

Изменено AlexeyMezenin (07.01.2017 17:17:10)

Не в сети

#3 07.01.2017 21:06:28

Re: Чем хорош orm, если он делает много запросов?

AlexeyMezenin пишет:

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

То что и хотел услышать.

AlexeyMezenin пишет:

Скинь сюда сырые запросы, которые создает Eloquent и Opencart, тогда будет понятно что к чему. И еще, есть возможность сравнить скорость выполнения запросов Eloquent и Opencart в одной и той же среде без кэширования? А еще, очень очень очень интересно посмотреть на код Opencart, который создает тотже запрос.

Сравнить не получится. И да, запросы разные.

Не в сети

#4 09.01.2017 17:47:11

Re: Чем хорош orm, если он делает много запросов?

Testuser123 пишет:

И разве это нормально что 15 запросов идет?

Изначально используй ORM, если есть веские причины делать сырые запросы - делай.

Абстракции и низкий уровень - это всегда баланс.

Не в сети

#5 10.01.2017 06:49:41

Re: Чем хорош orm, если он делает много запросов?

Так вот, сдесь получилось 15 запросов. К примеру в опенкарте всю эту инфу за 2 запроса берут.
И разве это нормально что 15 запросов идет?

хороший вопрос. на самом деле – да, это нормально и хорошо. и вот почему – когда ты запрашиваешь данные одним запросом с вагоном джойнов, тебе потом приходится разбирать эту кашу, потому что строки результата дублируются из-за соотношений один-ко-многим и многие-ко-многим. ещё хуже становится если выбирается не одна запись а несколько – в этом случае получается невозможно нормально сделать пагинацию – ведь limit и offset применяются к отдельным строкам а не к отдельным айдишникам какой-то «главной» таблицы – в джойне все таблицы равнозначны.

орм делает больше запросов, но на самом деле количество работы, которую выполняет СУБД, не становится больше. и вот почему – потому что запросы от орм работают с теми же самыми индексами и выбирают те же записи по тем же самым критериям. разница только в том что вместо объединения записей на уровне СУБД, выполняется гидратация моделей на уровне орм.

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

орм в ларавеле – хорошая. если ей грамотно пользоваться, она почти такая же эффективная, как если писать запросы руками. в моём опыте мне приходилось оптимизировать запросы буквально пару-тройку раз в очень специальных случаях. плюс я использовал query builder напрямую когда писал парсер, обрабатывающий десятки тысяч записей – тормоза выходили из-за магии с доступом к полям в самих моделях через getAttribute с поддержкой кастования и мутаторов и т.д. и т.п. – оказалось проще обойтись без моделей вообще, благо код был простой, а ограничения по времени работы скрипта – очень строгие. но это вот два примера, когда – изредка – приходится работать не через орм. в остальных случаях – пользуйся и не парься. правильный выбор индексов и выделение СУБД достаточного количества памяти влияет на производительность намного, намного сильнее

Не в сети

#6 12.01.2017 18:48:25

Re: Чем хорош orm, если он делает много запросов?

и да, не забываем, а кто не в курсе - наматываем на ус, что 15 простых запросов (select/where) работают в разы быстрее 2-х с join'ами.
проблему создаёт не количество запросов, а три вещи: 1 - архитектура; 2 - индексы; 3 - "глаза боятся, а руки из жопы" (с)

Не в сети

#7 22.01.2017 20:09:25

Re: Чем хорош orm, если он делает много запросов?

Спасибо всем за развернутые ответы. Всем по плюсу поставил

Не в сети

Подвал раздела