sergeiss
Цитата |
Да, я считаю его неправильным, цикл при запросе к БД. Если честно, то даже аргументировать не хочу. |
Ну это понятно. Нафиг аргументировать, да и вообще нафиг вникать. Есть только два мнения. Твое и неправильное.
Цитата |
Я сразу, в начале темы, предложил наиболее правильное решение - функцию внутри БД. На что мне возразили, что не в каждой БД это возможно. ОК, пусть так. Значит работаем с "кривой" БД. |
На сколько я помню, возражение было не про базу, а про хостинг, запрещающий функции в БД. А это не кривизна, а печальная действительность. На шаредах, особенно на бесплатных, приходится отказываться от многих вкусняшек.
Цитата |
Далее, как вариант, я предложил оценить одним запросом сразу несколько значений. |
Но почему то пропустил, что в любом случае потребуется еще один запрос на запись. А это ну никак не быстрее моего варианта. А намного медленнее и затратнее.
Цитата |
А причина очень простая. На отправку запроса и возврат данных каждый раз тратится некоторое время. Тут немного, там немного... А в итоге может набежать уже немало. |
Вот тут ты и окарал. Потому что вероятнее всего второго витка при таких диапазонах не потребуется. В противном случае нужно просто расширить диапазон. Это просто подстраховка. А у тебя в любом случае нужно выполнить минимум два запроса и два раза вернуть результат. И это ты называешь
Цитата |
программировать правильно |
Что тут правильного? Увеличить вдвое количество запросов, дабы отстоять параноидальное утверждение, что запрос в цикле всегда плохо? Это не правильное программирование. Это догматика и зашоренность. И необоснованный страх. Этому ты учишь людей?
Вот они то и будут
Цитата |
потом долго и нудно переучиваться. |
А скорее всего не будут. Как ты. Будут лепить по два запроса туда, где достаточно одного.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
sergeiss
22.12.2014 - 12:47
Цитата (twin @ 22.12.2014 - 12:20) |
Будут лепить по два запроса туда, где достаточно одного. |
...одного, многократно повторенного в цикле... Ну да, ну да
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
sergeissС чего он многократно повторяется то
Посчитай вероятность этого повторения сначала. Хотя бы одного.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Кстати. Просвети, как ты собрался делать это без цикла?
Цитата |
Если вдруг окажется, что все 10 айди заняты, то повторяем процедуру, сгенерировав новый набор айди. |
Рекурсией?
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Можно еще так: вытянуть все id из БД. Сгенерить число и сравнить с массивом вытянутых результатов, и дождавшись такого число которого нет в массиве произвести запись в БД.
Неэффективно, но быстро и без лишних нагрузок на БД.
sergeiss
22.12.2014 - 13:59
Цитата (twin @ 22.12.2014 - 12:56) |
Рекурсией? |
Цитата (sergeiss @ 22.12.2014 - 00:20) |
Если вдруг окажется, что все 10 айди заняты, то повторяем процедуру, сгенерировав новый набор айди. Но можно утверждать, что с высокой степенью вероятности достаточно будет одного запроса для достаточно большого количества записей. |
Вероятность необходимости повторного запроса с 10-ю айди существенно меньше (в разы или на порядки), по сравнению с запросом, где только один айди проверяется.
Цитата (mvg @ 22.12.2014 - 13:56) |
Неэффективно, но быстро и без лишних нагрузок на БД. |
Неэффективно, долго и с лишней нагрузкой на БД.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
mvg
В любом случае это минимум 2 запроса. В моем случае повторный виток цикла потребуется крайне редко. Лень считать, но вероятность где то 1 повтор на 5 миллиардов попыток записи. Это субъективная оценка, кому интересно, посчитайте точнее.
sergeiss
Цитата |
Вероятность необходимости повторного запроса существенно меньше (в разы или на порядки), по сравнению с запросом, где только один айди проверяется. |
Вот скажи, в чем разница между вероятностью 5 миллиардов попыток на одно повторение и 5 миллионов? Я тебе скажу, для веб-приложения ни-ка-кой. А вот два запроса при каждой попытке или один - это очень ощутимая разница.
И все же. Ты не ответил. Как ты без цикла собираешься повторить операцию неизвестное количество раз. Ведь по твоим стойким убеждениям
Цитата |
это ПЛОХО. Нет, не так. Это КАТЕГОРИЧЕСКИ ПЛОХО! |
Научи, как сделать "хорошо".
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Valick
22.12.2014 - 14:14
twin, "Борис, ты не прав"

твой вариант будет работать хуже и хуже с ростом таблицы
причём по теории вероятности, твой вариант может вообще зациклится наглухо

вероятность мала, но она есть
_____________
Стимулятор ~yoomoney - 41001303250491
ValickТы или не понял, или делаешь это намеренно.
В чем разница, проверять уникальность на стороне БД или на стороне PHP, если все равно при неудачном стечении обстоятельств (распухла таблица), все равно вы никак не обойдетесь без цикла. Ну только если действительно не вытаскивать все значения. Что при "распухшей" таблице тоже далеко не камильфо.
Если прогнозируется большой рост, нужно увеличить диапазон, только и всего. Если диапазон увеличить нельзя, то нужно просто увеличивать значение на 1 и делать рандомной выборку. А с этим вполне справляется автоинкремент. Начальное значение которого можно очень просто задать тем же значением 1000000000. Все равно нужен один запрос при записи и проверка вообще теряет смысл.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Valick
22.12.2014 - 14:30
twin, я сейчас говорю о твоём варианте (вариант
sergeiss чуть лучше, но тоже не ахти)
Если нужна уникальная рандомная последовательность то её необходимо сформировать заранее, дальше только обычная выборка.
_____________
Стимулятор ~yoomoney - 41001303250491
ValickЗаранее не всегда возможно. Да и не всегда продуктивно. Это хорошо, когда известно необходимое количество кодов.
Вообще существует предел разумного. Теоретически можно конечно рассуждать о том, что могут так встать звезды, что раз в год цикл отработает три-четыре витка. Ну и что, пусть. Это все равно гораздо меньше, чем каждый раз по два запроса. И кстати продуктивнее, чем хранить заранее сформированную последовательность из такого количества значений, которое может представлять опасность "зацикливания".
Что касается этого "полного зацикливания", повторюсь. Нужно просчитать такую вероятность. Если это 1 к 5 миллиардам, то тьфу не это. Уйдет скрипт в таймаут с вероятностью 1 на 5 млрд посетителей. Люди боятся летать на самолетах, хотя смертность от падения с кровати гораздо выше.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
sergeiss как в postgresql дело со stored proc? можно ли их создавать обычному юзеру или тоже только для рута? Может есть смысл конвертнуть БД с mysql на postgreSQL?
В MySQL как уже выше отметил триггеры и stored procedure только супер пользователю.
sergeiss
22.12.2014 - 15:03
Цитата (twin @ 22.12.2014 - 14:10) |
Научи, как сделать "хорошо". |
Очень просто

Стремиться к тому, чтобы циклов обращений к БД не было. Либо, хотя бы, чтобы минимизировать их количество до минимально. И ни в коем случае никогда не говорить, что "циклы запросов к БД - это хорошо". Вот тогда будет "хорошо" в целом.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)