За последние 24 часа нас посетили 27548 программистов и 1485 роботов. Сейчас ищут 1030 программистов ...

Обновление в бд только изменных данных

Тема в разделе "PHP и базы данных", создана пользователем Slavka, 6 апр 2014.

  1. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    Имеем бд на postgresql.Имеем некую форму для изменения данных ( назовем это карточка объекта) она очень большая - и располагается на нескольких страницах ( используется jquery tabs).
    Так вот - вывод и заполнение всех в форме это не проблема. Проблема заключается в том чтобы не обновлять все поля - а каким то образом обновить в бд только измененные .. а вот как это сделать - не совсем понимаю. Как определить что поле изменено.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Не заморачивайся насчет отдельных полей, обновляй всю запись целиком.

    Недавно сам озабачивался задачей "как определить какие из записей в табличной форме были изменены".
    Впервые использовал операцию clone и операцию сравнения объектов :) Всё когда-то бывает впервые.
    У меня есть некий Data Mapper и итератор для представления коллекции записей. После отправки формы в цикле проверяю элементы коллекции. Примерно так:
    Код (PHP):
    1. foreach ($Collection as $myObjects) {
    2.     $row = $form[$myObject->id]; // форма как массив записей, проиндексированных по ID
    3.  
    4.     $shapshot = clone $myObject; // здесь будет "старая версия" объекта
    5.     $repo->load($myObject, $row); // применяем поля из формы
    6.     // не факт, что хоть то-нибудь изменилось
    7.     if ($myObject != $shapshot) { // PHP умеет сравнивать объекты!
    8.         $repo->persist($myObject); // сохраняем если были изменения
    9.     }
    10.     unset($shapshot);
    11. }
    12.  
     
  3. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    Я просто немного недорассказал - почему именно измененные поля меня интересуют ..
    Это корпоративная база данных - и иногда в процессе работы ктото данные меняет - и требуется хранить историю изменений за весь период.
    Т.е. в отдельную таблицу должны сваливаться данные - кто когда и что поменял.

    я немного не понял представленный кусок кода.. тут идет сравнение двух форм это понятно - но откуда взять изначальную форму - ведь она ушла пользователю и он ее правит.. получается пользователь должен вернуть две формы - новую и старую ?
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    сравнение не двух форм, а двух состояний одной и той же записи. состояние "до" и состояние "после".

    Добавлено спустя 3 минуты 43 секунды:
    из твоего объяснения про историю изменений никак не следует, что сохранять надо не все поля.

    это просто отдельная задача — логи изменений. часто решается триггерами в базе, либо если есть какая-то ORM, используются ее встроенные воможности. по сути те же триггеры.

    подумай вот о чем: в бумажном документообороте очень часто документ состоит из заголовка документа и табличной части. в базе заводят, как минимум, две таблицы чтобы это описать: собственно документ и детализация.
    история изменений относится к сущности "документ", даже когда изменилась строка в детализации. короче говоря, если нужна история, это хороший повод изучить какой-нибудь ORM. чтобы оперировать "объектами предметной области" и поменьше думать о таблицах.
     
  5. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    пасиб за наводку.. подумаю.. может чего и соберу =))
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Как обычно я сначала пытаюсь навязать своё видение мира, а потом даю буквальный ответ на вопрос )))

    Если твоя запись в скрипте в виде массива, ты можешь вычислить чем новая версия записи отличается от старой: в PHP есть функции array_diff, array_diff_assoc и др. похожие названия. Учи матчасть, пробуй, экспериментируй.

    Добавлено спустя 14 минут 41 секунду:
    Вот еще в копилку: Версионность и история данных
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Храни рядом таблицу с полями:
    дата| пользователь| запрос
    Где запрос - это SQL-запрос, приведший к изменениям. Одно из самых простых, но мощных решений.

    Как только кто-то что-то меняет, делаешь два запроса - один, который меняет и, если транзакция завершится без ошибки, шлем второй запрос в копилку.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    транзакция должна включать в себя все связанные операции, в т.ч. запись истории. иначе смысл транзакции теряется.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Окей, это никак не противоречит самому принципу такого логгирования. Пусть в одной транзакции идут запросы. Это действительно правильнее, а результат тот же.