Как мне настроить таблицу в базе данных, чтобы вести историю записей? - PullRequest
0 голосов
/ 11 апреля 2011

Я пытаюсь настроить базу данных сервера SQL для сайта ASP.NET MVC, который будет хранить как самую последнюю информацию, так и историю всех изменений данных.

Информация для моегоСайт создан на основе файлов XML, загруженных пользователем.Сайт анализирует XML и записывает содержащуюся информацию в базу данных сайтов.Элементы в последовательных загрузках могут фактически представлять одну и ту же вещь, но некоторые данные могли измениться.Тем не менее, как я уже говорил, я хочу отслеживать каждую версию.

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

Upload 1: Erik and Sara are added
Upload 2: Erik renamed to Eric, Bill added
Upload 3: Sarah grew 2" taller, Eric was removed.


[PERSONS TABLE]
PersonID     Name    Height    UploadID
1            Erik    71        1
1            Eric    71        2
2            Sarah   70        1
2            Sarah   70        2
2            Sarah   72        3
3            Bill    76        2
3            Bill    76        3


[UPLOADS TABLE]
UploadID    UploadTime
1           3/09/2011
2           4/01/2011
3           4/11/2011

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

1 Ответ

1 голос
/ 11 апреля 2011

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

PERSONS
PersonID, Name, Height
1            Eric    71
2            Sarah   72  
3            Bill    76

UPLOAD
UploadID, UploadTime
1           3/09/2011
2           4/01/2011
3           4/11/2011

PERSONS_EDIT
PersonID, UploadID,      ChangeSQL,                                    ChangeDescription
1          1         "insert into PERSONS(Name, Height) VALUES('Erik', 71)" "Erik added"
1          2         "update PERSONS set name='Eric' where Name='Erik'"    "Changed Erik's name"
....      ...              ......                                            ....

Я не думаю, что вы можете сделать намного больше, чтобы сделать ваши таблицы проще или базу данных меньше. Как видите, ваша таблица PERSONS_EDIT станет вашей самой большой таблицей. База данных, которую вы используете, может предоставить механизмы для этого автоматически (какая-то запись транзакций или что-то в этом роде), но я никогда не использовал ничего подобного, поэтому я оставлю это другим людям в Stackoverflow, чтобы они делали какие-либо предложения, если они существовать. Если таблица PERSONS_EDIT становится слишком большой, вы можете посмотреть на удаление записей старше недели / месяца / года. Решение о том, когда это сделать, будет зависеть от вас.

Некоторые другие причины для внесения этого изменения в вашей первой таблице вам пришлось использовать PersonId и UploadID в качестве первичного ключа для вашей таблицы персон. Таким образом, чтобы получить самую последнюю версию ЧЕЛОВЕКА в вашем приложении, вам нужно было бы сделать что-то, где вы выбираете человека по идентификатору, а затем заказать его по UploadId и выбрать тот, у которого самый большой идентификатор загрузки КАЖДЫЙ РАЗ, КОТОРЫЙ ВЫ ДЕЛАЕТЕ СДЕЛКА НА ОДНОГО ЛИЦА.

Еще одним преимуществом является то, что вам не нужно делать кучу необычных SQL, чтобы получить историю редактирования. Просто сделайте выбор * из таблицы PERSONS_EDIT.

...