Сохранение старых данных, измененных пользователем - PullRequest
2 голосов
/ 12 октября 2009

У меня есть таблица users, которая имеет следующие поля: userid, phone, and address. Так как это пользовательские данные, я позволяю пользователю изменять их в любое время. Проблема в том, что я хотел бы отслеживать эти изменения и сохранять старые данные. Вот некоторые из идей, которые я рассмотрел:

  • добавление новых данных к старым данным и использование разделителя как канала. При получении поля я проверял бы наличие этого разделителя и, если он существует, получал символы после него в качестве новых данных. (чувствует себя громоздким и не чувствует себя хорошо)

  • настройка другой таблицы changes со следующими полями: userid, fieldname, fieldcontent. Когда / если пользователь изменяет данные (любые данные), я регистрирую событие в этой отдельной таблице под идентификатором пользователя, а также именем / идентификатором поля и старым содержимым поля, тогда я могу перезаписать его старые данные в users с новым. Если я хочу найти все изменения, сделанные этим пользователем, я буду искать в таблице changes по его идентификатору пользователя. Проблема в том, что я смешиваю все изменения данных (всех полей) в одну таблицу, и поэтому поле fieldcontent в changes должно быть текстовым, чтобы вместить различные типы полей. Это все еще кажется лучше, чем первая идея, но все еще не уверен, правильно ли я поступаю.

Какие есть еще идеи или известные передовые практики для сохранения старых данных?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 12 октября 2009

Что бы ты ни делал, не делай первого.

Таблица изменений - лучший подход. Это также называется таблица аудита или истории. Я бы не стал делать историю пар ключ-значение. Вместо этого сделайте историю для соответствующей таблицы. Вы можете сделать это в коде приложения или через триггеры базы данных. В основном, когда происходит вставка, обновление или удаление, вы записываете, что произошло и какие данные были изменены.

Пользователь таблицы:

  • ID
  • имя пользователя
  • адрес электронной почты
  • телефон
  • адрес

Таблица user_history:

  • ID
  • change_type (I, U или D для вставки, обновления или удаления)
  • user_id (FK user.id)
  • адрес электронной почты
  • телефон
  • адрес
  • дата / время изменения
  • опционально, также магазин, который изменил запись
1 голос
/ 12 октября 2009

Очень простой способ, который мы использовали для отслеживания таких изменений, таков:

users_history` 
    userid 
    changenumber smallint not null
    changedate datetime not null
    changeaddr varchar(32) not null
    phone NULL,
    address NULL

    primary key on (userid, linenumber)

Каждый раз, когда вы ВСТАВЛЯЕТЕ или ОБНОВЛЯЕТЕ запись в таблице users, просто ВСТАВЛЯЙТЕ новую запись в таблице users_history. changenumber начинается с 1 и увеличивается оттуда. changedate и changeaddr могут использоваться для отслеживания, когда и где.

Если значение поля не изменилось, не стесняйтесь указывать NULL в соответствующем users_history поле таблицы.

В конце концов, вашему приложению не нужно изменять или хранить громоздкие исторические данные в таблице users, но у вас есть все, если оно у вас под рукой.

Edit:

Это сохраняет старые данные. См. Следующий пример, где пользователь начал с заданного адреса и телефона, а затем через 4 дня обновил адрес, а через 5 дней обновил телефон. У вас есть все.

Запись текущих пользователей:

100                            |  234-567-8901   |   123 Sesame Street


Таблица истории образцов

100   |  1  | 2009-10-01 12:00 |  123-456-7890   |   555 Johnson Street
100   |  2  | 2009-10-05 13:00 |  NULL           |   123 Sesame Street
100   |  3  | 2009-10-10 15:00 |  234-567-8901   |   NULL
0 голосов
/ 12 октября 2009

Самый простой способ реализовать это будет иметь другую таблицу только для целей истории, снимок. Вам не нужно отражать все поля, просто

change_id // row id (just for easy management later on if you need to delete specific row, otherwise its not really necessary)
user_id // Original user id
change_time // time of change
data // serialized data before change.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...