Ответы пользователя по тегу PHP
  • Многопоточность и MySQL?

    @Joysi75
    А в чем проблема?
    Базу данных проблемы использующих ее приложений не волнуют. Она в порядке очереди будет обрабатывать поступающие запросы и выполнять их. При выполнении операций модификаций будет блокировать таблицу на изменение. Если будут параллельные запросы к данному ресурсу - положит их в очередь до завершение блокирующих операций, если параллельный запрос к незаблокированному ресурсу - запустит его выполнение не дожидаясь результатов предыдущих.

    У вас таблица с identity. И одновременно поступило пятьсот insert-ов. Все они встанут в очередь. И будут отработаны (будут выполнены или нет из-за некорректности данных). Единственное но, если одно приложение послало подряд не в транзакции два insert-а, никто не гарантирует что у них idenitity поля после вставки будут отличаться на единицу.

    И не стоит реализовывать в клиентской программе логику, например:
    вы вставили значение в таблицу c identity ключом, получили его на клиенте и по привычке однопользовательской БД решили получить количество записей в таблице как значение idenity поля (при условии что данные из нее вы не удаляете) для дальнейших действий. Вот тут может не прокатить, так как между последней ВАШЕЙ операцией Insert может кто-то еще вставить данные и вы не учтете их в логике приложения.

    P.S.
    Также помните, если вам надо выполнить в базе данных подряд несколько логически связанных операций , то оформите их как транзакцию - логический неделимый блок операций. При этом операции будут выполнены подряд последовательно, результат будет:
    -отражен в БД данных при условии , что все операции выполнены корректно
    -полностью отменен и БД восстановит состояние, в котором она была до выполнения первой операции в транзакции при условии, что какое либо действие в транзакции не исполнилось.
    Ответ написан
  • Как правильнее сделать выборку и построения графа рефераллов?

    @Joysi75
    MySQL обязательно использовать? Нет возможности сменить его на Postgres (или другие СУБД где есть рекурсивные запросы - Oracle/MSSQL/DB2)?

    Есть или нет готовые библиотеки для отрисовки из СУБД не знаю. Но возможно получить из таблицы пути для построения дерева. Если устроит то следующим образом.
    (К сожалению под рукой нет postgresql,) запрос примерно такой:
    WITH 
        RECURSIVE search_graph(id, ref_id) AS
        (
            SELECT id, ref_id
            FROM Users
            UNION ALL
            SELECT o.id, o.ref_id
            FROM Users o
        JOIN search_graph p ON p.ref_id = o.id
        )
        SELECT array_agg(id || ' -> ' ) AS "path"
        FROM search_graph
        GROUP BY id
        ORDER BY id
    ;

    Должен выдать:
    1 ->
    2 -> 1 ->
    3 -> 1 ->
    4 -> 1 ->
    5 -> 4 -> 1 ->

    Последний '->' можно при необходимости убрать через substring(str, from 1 for (length(str)-4))

    P.S. С MySQL форками и последними версиями не работал - может и появились рекурсивные запросы - не знаю. Или возможно через хранимую процедуру/функцию сделать аналог.
    Ответ написан
  • Насколько допустимы запросы без LIMIT?

    @Joysi75
    Плюсы использования limit:
    1) Ограничение и предсказуемость кол-во результирующих строк со стороны сервера,
    2) Меньше нагрузка на сеть,
    3) Проще проектировать GUI выдавая результат запроса "пачками" с определенным количеством строк.
    4) Подсказка для оптимизатора запросов, что приведет к увеличению производительности выборки со стороны сервера

    Минусы использования limit:
    1) Можно сломать логику и/или пропустить ошибку. Допустим в таблице справочника отсутствует primary key и задублировалась запись. Применяя выборки с limit 1 - не поймаете данную ошибку.
    2) Отсутствует в стандарте SQL до 2011.
    3) Не стандартизирован в SQL92. Многие СУБД имеют аналоги (top - MSSQL, Offset - вроде в Postgres; или, еще хуже - конструкции с where rownum = в Oracle ). То есть меняя версию СУБД Вам, возможно, придется переписать все подобного рода запросы.

    P.S. Такого рода споры о целесообразности применения конструкций СУБД необходимо решать с 2х точек зрения СУБД и Приложения. Уверены, что у Вас 99.999999% нет ошибок в реализации объектов СУБД и не планируете переходить на другие СУБД - применяйте limit, иначе задумайтесь.
    P.S.S. Аналогичен спор и о необходимости Order by. Серверные люди скажут, что order by - баловство, не стоит нагружать сервер задачами сортировки полученных данных - это "крестьянское" дело должно ложиться на плечи приложения :)
    Ответ написан
  • Выборка данных из трех таблиц MySQL с условием многие к одному?

    @Joysi75
    Немного не догоняю.
    Одним запросом:
    select ads.id, ads_meta.text, ads_images.path ...
    from ads, ads_images, ads_meta
    where ads_images.ads_id=ads.id and ads_meta.ads_id=ads.id
    order by ads.id

    открыть запрос и внутри него пробежать по всем записям в цикле, внутри которого сравнивать текущее значение ads.id со значением на предыдущем шаге, и основываясь на этом формировать вывод или анализ.

    Если будете разбивать на несколько запросов , то все равно объем информации пересылаемой с сервера БД не уменьшиться, да и на клиенте придется держать доп массивы, чтобы сохранять данные для будущих сравнений в IN-выражениях.

    P.S. Экзотика:
    1)Создайте таблицу ads_exotic ( ads_id, ads_meta_data, ads_images_data)
    2) Заведите триггеры на модификацию таблиц ads_meta и ads_images, которые будут редактировать поля ads_meta_data и ads_images_data (допустим, добавляя/удаляя/изменяя через разделители отмодифицированные данные)
    Ну и позже банально select * from ads_exotic where ads_id=X
    Но это противоречит правилам нормализации БД.
    Ответ написан
  • Какой вариант хранения данных лучше?

    @Joysi75
    А использовать сторонние системы задания прав и аутентификации не рассматриваете?

    Если объектов аудита (новости, комментарии и т.п.) мало, то 1-й лучше:
    занимается меньше места, восемь комбинаций разрешений для прав в одной записи таблицы

    Если объектов аудита много, то лучше 2-й (или вводить дополнительную таблицу объект аудита), так как в первом случае придется добавлять расширением первой таблицы. Будет происходить добавлением полей (например, commentAdd, commentEdit, commentDelete и т.п.). И возможно, записи в таблице будут в этом случае сильно разрежены.

    P.S. А вообще (если не использовать стороннее решение), лучше немного поструктуризировать (если помимо новостей будут другие объекты аудита):
    - Таблицы объект аудита, Тип операции и т.п.
    Ответ написан
  • Как отсортировать составной запрос?

    @Joysi75
    Или есть подвох в вопросе или в исходном вопросе изменить строчку на
    JOIN `eav_values` as `val` ON (`products`.`value_id` = `val`.`value_id` and `products`.`value_id`=2)
    Ответ написан