Pdo, postgresql, lastinsertid

Европа - быстрые серверы на дисках NVMe от $5 / Русский датацентр от 199руб

Тема в разделе "PHP & Postgres", создана пользователем junior17, 10 мар 2018.

Метки:
  1. Adelf

    Adelf Laravel&PhpStorm Команда форума

    Сообщения:
    3.251
    Ваш город:
    Казань
    Address:
    Kazan, Russia
    Country:
    Location on Map:
  2. Фанат

    Фанат oncle terrible Команда форума

    Сообщения:
    39.863
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Я в постгресе не разбираюсь, но нигде не увидел по ссылке, что nextval is connection based
    поэтому вопрос остается в силе
     
  3. Adelf

    Adelf Laravel&PhpStorm Команда форума

    Сообщения:
    3.251
    Ваш город:
    Казань
    Address:
    Kazan, Russia
    Country:
    Location on Map:
    nextval

    Advance the sequence object to its next value and return that value. This is done atomically: even if multiple sessions execute nextval concurrently, each will safely receive a distinct sequence value.
     
    AnrDaemon и Фанат нравится это.
  4. Фанат

    Фанат oncle terrible Команда форума

    Сообщения:
    39.863
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    А, дошло, спасибо
     
  5. флоппик

    флоппик promotor fidei Команда форума Партнер клуба

    Сообщения:
    4.901
    Ваш город:
    Павлодар, Казахстан
    Address:
    Pavlodar, Kazakhstan
    Country:
    Location on Map:
    Вообще, надо сказать, что подход с nexval он как раз таки каноничный, и используется в том числе и в оракле, например, а автоинкремент как раз таки исторически сложившийся персональный мускульный костыль для эмуляции секвенсов.
     
    fixxxer и Adelf нравится это.
  6. флоппик

    флоппик promotor fidei Команда форума Партнер клуба

    Сообщения:
    4.901
    Ваш город:
    Павлодар, Казахстан
    Address:
    Pavlodar, Kazakhstan
    Country:
    Location on Map:
    Не знаю как в постгре, кстати, а в оракле еще можно было запросить range из секвенса per connection, что дает возможность жахнуть все записи в один/смежные блоки в фс/на диске, что существенно влияет на скорость записи (ну и чтения, конеэшг).
     
  7. Вурдалак

    Вурдалак I'd like to model your domain

    Сообщения:
    6.121
    Ваш город:
    Russia, Moscow
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    А чо, в 2018 кто-то до сих пор пользуется AUTO_INCREMENT? Вам не больно?
     
  8. Фанат

    Фанат oncle terrible Команда форума

    Сообщения:
    39.863
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Доктрина пользуется, вроде.
     
  9. Adelf

    Adelf Laravel&PhpStorm Команда форума

    Сообщения:
    3.251
    Ваш город:
    Казань
    Address:
    Kazan, Russia
    Country:
    Location on Map:
    Она лишь поддерживает.
     
  10. флоппик

    флоппик promotor fidei Команда форума Партнер клуба

    Сообщения:
    4.901
    Ваш город:
    Павлодар, Казахстан
    Address:
    Pavlodar, Kazakhstan
    Country:
    Location on Map:
    Ну если уж быть совсем честным, автоинкремент 80% задач секвенсирования данных в табличках в веб-разработке покрывает, в принципе. Но в целом, 95% мускула создано из костылей и хаков, и автоинкремент далеко не самое худшее из них.
     
  11. fixxxer

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.834
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Честно говоря, за последние лет 5 не видел ни одного проекта (кроме моих), где бы им не пользовались (вместе с anemic models). Всем норм, чо.

    Это такая боль, которую осознаешь только когда понимаешь, как можно иначе. :)
     
  12. junior17

    junior17 Новичок

    Сообщения:
    26
    Ваш город:
    Москва, город Москва, Россия
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Друзья, так в чем профит вызывать сперва nextval, потом insert? Если можно простыми словами
     
  13. fixxxer

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.834
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Ну, в первом приближении...
    Знать ID заранее очень удобно, если ты пишешь объектно-ориентированные программы.

    Если знаю заранее:
    1) $id получили из nextval
    2) $user = new User($id, $name); // создали объект в памяти
    3) $userRepository->store($user); // записали его в базу

    Если не знаю заранее ID - то надо как-то создать сущность без ID, потом только после сохранения в базу его присвоить... Это все усложняет, особенно если между (2) и (3) еще всякое там разное, когда надо бы знать id юзера, а его пока еще нет.
     
    junior17 нравится это.
  14. Adelf

    Adelf Laravel&PhpStorm Команда форума

    Сообщения:
    3.251
    Ваш город:
    Казань
    Address:
    Kazan, Russia
    Country:
    Location on Map:
    @fixxxer, тут самый важный момент, что сущность new User($id, $name) изначально консистентная. ее можно передать куда угодно и там не надо будет проверять, закинули ли ее уже в бд или нет. есть у нее id или нет. ->exists() или не ->exists().
    если юзеру надо сразу добавить, например, роль, то можно тоже сразу создать и добавить его в юзерские роли. Ибо id юзера уже будет известен. На данном простом примере трудно понять профит. Но я пару раз уже напарывался на такое, что у нас автоинкремент а id очень хотелось бы получить пораньше.
     
    junior17 нравится это.
  15. fixxxer

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.834
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Ну он же просил простыми словами :)

    Со спагетти-кодом типа
    PHP:
    $pdo $dbh->prepare("INSERT INTO users (name) VALUES(?)");
    $pdo->bindValue(1$name);
    $pdo->execute();
    (а $name там наверняка прям из $_POST сотней строк выше) все равно будет непонятно, там-то разницы никакой не будет.
     
    junior17 нравится это.
  16. AnrDaemon

    AnrDaemon Продвинутый новичок

    Сообщения:
    4.460
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Вы ещё учитывайте, что в 99% применения PHP, новосозданную сущность просто некуда передавать, кроме как в базу. На чём, собственно, работа скрипта завершается.
     
  17. Вурдалак

    Вурдалак I'd like to model your domain

    Сообщения:
    6.121
    Ваш город:
    Russia, Moscow
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    У нас было на форуме обсуждение, вот примерные ссылки, конкретные цитаты лень приводить:
    https://phpclub.ru/talk/threads/Выбор-framework.80801/page-5#post-731461
    https://phpclub.ru/talk/threads/Выбор-framework.80801/page-4#post-731297
    https://phpclub.ru/talk/threads/Не-работает-auto_increment.80857/

    Если постараться дополнить то, что уже упомянул @fixxxer, то

    1. В консистентной модели зачастую пишут события а-ля UserRegistered, EmployeeWasHired, etc., которые должны уже содержать id сущности; но до момента сохранения в костыльных реализациях с AUTO_INCREMENT это невозможно. Сюда же вообще можно отнести кучу всякой мелочи, что описал @Adelf, когда нам не хочется думать в каком порядке что нужно сохранять.
    2. Зачастую полезно знать id сущности [задолго] до ее создания. Это может быть как асинхронная логика (передать id клиенту, поставить задачу в очередь), так и а-ля проверка на спам: проверяем контент до сохранения (если явный спам — отклоняем; если подозрительный — сохраняем id), а сохраненный id поможет в будущем вернуться к сущности и как-то ее заблокировать, если подозрения на спам подтвердятся (обычно такая логика бывает, если требуется некая «критическая» масса подозрительных объектов).
    3. Более высокая детерминированность команд: если я регистрирую игрока RegisterPlayer { id: 42, name: "lifecoach" }, то я ожидаю ровно того, что я указал, т.е. я ожидаю, что будет зарегистрирован игрок с id 42, если он есть — будет явная ошибка. В случае же RegisterPlayer { name: "lifecoach" } повышается вероятность того, что будет тупо зарегистрирован второй игрок с таким же ником. Чем более детерминированная команда, тем проще с ней работать и тестировать: меньше сюрпризов.
    4. Неожиданные сюрпризы от MySQL типа того, что по всей видимости были у автора в этом топике: «InnoDB uses the in-memory auto-increment counter as long as the server runs. When the server is stopped and restarted, InnoDB reinitializes the counter for each table for the first INSERT to the table, as described earlier.».

    Если говорить в общем, то AUTO_INCREMENT может оказывать очень серьезное негативное влияние на архитектуру приложения, а программисты зачастую даже не будут осознавать от чего у них так ломит в теле, потому что их с детства кормили иголками и они не допускают мысли, что их можно не есть.
    То есть, если программист не осознает, что AUTO_INCREMENT — это именно костыль, то это плохой для его команды знак.
     
    junior17 нравится это.
  18. Вурдалак

    Вурдалак I'd like to model your domain

    Сообщения:
    6.121
    Ваш город:
    Russia, Moscow
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Ну, это значит, что у тебя 80% сущностей без событий, как минимум в том виде, в котором это делаю я (запись внутри сущности). У меня процент таких сущностей существенно меньше.
     
  19. флоппик

    флоппик promotor fidei Команда форума Партнер клуба

    Сообщения:
    4.901
    Ваш город:
    Павлодар, Казахстан
    Address:
    Pavlodar, Kazakhstan
    Country:
    Location on Map:
    Меня как раз после оракла регулярно колет автоинкрементом ) Но ребятам вокруг норм.)
     
  20. junior17

    junior17 Новичок

    Сообщения:
    26
    Ваш город:
    Москва, город Москва, Россия
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Проблема с Auto_Increment (auto_increment = max(id)) только в mysql(innodb) или в postgre такая же история? Ведь мы создавая
    SEQUENCE указываем INCREMENT BY 1. Тоже ведь тоже auto_increment?