Sql при Model::findOne()

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Sql при Model::findOne()

Сообщение samdark »

Именно. Сейчас везде поведение одинаково и это хорошо. Никаких сюрпризов.

Если нужно поддерживать Oracle или MSSQL (а это все проекты типа продукт: CMS, форумы и другие движки) и поменять, то так и так придётся добавить в запросы аля Post::find()->orderBy('id DESC')->one(); LIMIT руками, а из Post::find()->where(['id' => 10])->one(); убирать. Только дойти до этого станет сильно сложнее потому как для MySQL всё будет нормально.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Sql при Model::findOne()

Сообщение zelenin »

Sam Dark писал(а):Именно. Сейчас везде поведение одинаково и это хорошо. Никаких сюрпризов.

Если поменять, то так и так придётся добавить в запросы аля Post::find()->orderBy('id DESC')->one(); LIMIT если нужно поддерживать Oracle или MSSQL (а это все проекты типа продукт: CMS, форумы и другие движки). Только дойти до этого станет сильно сложнее потому как для MySQL всё будет нормально.
никаких сюрпризов и не будет, т.к. данные будут на выходе одни.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Sql при Model::findOne()

Сообщение astronin »

а давайте так, ставим limit только для limit-DB, и пишем в документации большими буквами, что ребят, если хотите использовать one() и НЕ limit-DB, то вставляйте limit в ручную где надо и не вставляйте где не надо, т.к. для этих баз это болезненный момент...
все будут знать эту особенность, и вопросов не будет. а количество сайтов на mysql гораздо больше и народу не придется ломать голову, прописывая limit-ы
Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: Sql при Model::findOne()

Сообщение VaNnOrus »

astronin писал(а):а давайте так, ставим limit только для limit-DB, и пишем в документации большими буквами, что ребят, если хотите использовать one() и НЕ limit-DB, то вставляйте limit в ручную где надо и не вставляйте где не надо, т.к. для этих баз это болезненный момент...
все будут знать эту особенность, и вопросов не будет. а количество сайтов на mysql гораздо больше и народу не придется ломать голову, прописывая limit-ы
Александр Вам про одно - Вы опять про свое. Каких большинство сайтов на mysql, когда Александр Вам говорит о том, что проблемы будут у разработчиков цмс, движков каких-то, которые в итоге могут разворачиваться на любой поддерживаемой бд.

Согласен с Александром, что одна функция не должна по разной логике работать в разных субд, даже если теоретически результат будет одним.
Последний раз редактировалось VaNnOrus 2014.11.20, 17:35, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Sql при Model::findOne()

Сообщение zelenin »

VaNnOrus писал(а):
astronin писал(а):а давайте так, ставим limit только для limit-DB, и пишем в документации большими буквами, что ребят, если хотите использовать one() и НЕ limit-DB, то вставляйте limit в ручную где надо и не вставляйте где не надо, т.к. для этих баз это болезненный момент...
все будут знать эту особенность, и вопросов не будет. а количество сайтов на mysql гораздо больше и народу не придется ломать голову, прописывая limit-ы
Александр Вам про одно - Вы опять про свое. Каких большинство сайтов на mysql, когда Александр Вам говорит о том, что проблемы будут у разработчиков цмс, движков каких-то, которые в итоге могут разворачиваться на любой поддерживаемой бд.
проблем не будет. выхлоп функции one будет одинаков.
Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: Sql при Model::findOne()

Сообщение VaNnOrus »

zelenin писал(а):
VaNnOrus писал(а):
astronin писал(а):а давайте так, ставим limit только для limit-DB, и пишем в документации большими буквами, что ребят, если хотите использовать one() и НЕ limit-DB, то вставляйте limit в ручную где надо и не вставляйте где не надо, т.к. для этих баз это болезненный момент...
все будут знать эту особенность, и вопросов не будет. а количество сайтов на mysql гораздо больше и народу не придется ломать голову, прописывая limit-ы
Александр Вам про одно - Вы опять про свое. Каких большинство сайтов на mysql, когда Александр Вам говорит о том, что проблемы будут у разработчиков цмс, движков каких-то, которые в итоге могут разворачиваться на любой поддерживаемой бд.
проблем не будет. выхлоп функции one будет одинаков.
Совсем не факт.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Sql при Model::findOne()

Сообщение zelenin »

VaNnOrus писал(а):Совсем не факт.
отличная аргументация
Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: Sql при Model::findOne()

Сообщение VaNnOrus »

zelenin писал(а):
VaNnOrus писал(а):Совсем не факт.
отличная аргументация
Могу сказать тоже самое о:
zelenin писал(а):проблем не будет. выхлоп функции one будет одинаков.
Разная логика работы функции в разных субд - это хуже, чем заставлять вручную писать лимиты там где они нужны. Хоть и не логично, что one выбирает совсем не one.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Sql при Model::findOne()

Сообщение zelenin »

VaNnOrus писал(а):
zelenin писал(а):
VaNnOrus писал(а):Совсем не факт.
отличная аргументация
Могу сказать тоже самое о:
zelenin писал(а):проблем не будет. выхлоп функции one будет одинаков.
Разная логика работы функции в разных субд - это хуже, чем заставлять вручную писать лимиты там где они нужны. Хоть и не логично, что one выбирает совсем не one.

как работает сейчас:
получение всех записей -> отдается первая

как будет:
Вариант 1: получение первой из всех записей -> отдается первая, она же единственная
Вариант 2: получение всех записей -> отдается первая

где тут место ошибке?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Sql при Model::findOne()

Сообщение samdark »

Не, ну zelenin, конечно, верно говорит что выхлоп один. Проблема не в выхлопе, а в том, какой ценой этот выхлоп получается.

1. Если мы добавим limit ко всему, получим неоптимальные запросы по ID для MSSQL и Oracle. Не вариант вообще.
2. Если мы добавим limit только для MySQL и ко., все разработчики устанавливаемых продуктов потенциально огребут. Особенно те, кто разрабатывает на СУБД, которые поддерживают LIMIT, а на Oracle и MSSQL только тесты гоняют. Мне не нравится лично этот вариант, но, по крайней мере, он технически осуществим.

На всякий пожарный добавил в доку: https://github.com/yiisoft/yii2/commit/ ... b950fe6242
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Sql при Model::findOne()

Сообщение astronin »

если это не поправить как-то, то я вижу большую проблему в том, что функция не работает так как от нее ждут.
т.е. если завтра вдруг таблица разрастется и запрос с one() будет тормозить, то возникнут вопросы, "а какого ж блин фига..."
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Sql при Model::findOne()

Сообщение samdark »

Вообще там внутри fetch PDO-шный, а не fetchAll(). То есть данные не должны вытягиваться все какой бы там LIMIT не стоял. Надо замеры сделать по времени выполнения и памяти. Оно не должно отличаться, но в PDO я не совсем уверен...
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Sql при Model::findOne()

Сообщение samdark »

Данные не тянутся, то есть прям катастрофы не будет, но всё равно с limit отрабатывает прилично быстрее:

Изображение

Изображение
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Sql при Model::findOne()

Сообщение samdark »

astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Sql при Model::findOne()

Сообщение astronin »

документация это хорошо, хотя бы теперь это как-то будет известно
а все же, что на счет сделать limit(1) в методах one() для баз, которые поддерживают "легкий" LIMIT?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Sql при Model::findOne()

Сообщение samdark »

Ну нельзя логику запроса настолько сильно менять в зависимости от базы...
Ответить