Как хранить разные версии данных в реляционной базе данных? - PullRequest
2 голосов
/ 28 февраля 2012

Вот пример, например, у меня есть таблица с именем Profile, и у меня есть разные столбцы, такие как:

id, firstName, secondName, address

Как правило, я создаю профиль, полный информации и базы данныхбудет выглядеть примерно так:

 1| Ted | WONG | Hong Kong |

после этого я могу обновить данные, например:

 1| Ted | WONG | US |

данные Hong Kong будут изменены командой SQL UPDATEи я теряю след предыдущих данных.Итак, есть ли способ позволить базе данных отслеживать предыдущие данные и поддерживать текущую информацию?Спасибо.

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

Добавьте столбец номера версии, который вы увеличиваете с каждым обновлением, но сохраняете тот же идентификатор.Затем при получении последней строки для данного идентификатора вам нужно сделать

where versionNo = (select max(versionNo) from table where id = <outerTableAliasOrVariable>.id)
1 голос
/ 19 декабря 2012

Добавьте столбец «Версия» в качестве первого столбца каждой таблицы, для которой вы хотите отслеживать версии, и их дочерние таблицы.Столбец должен быть добавлен в ваш кластерный первичный ключ в качестве первого столбца.Текущая версия всегда должна иметь Version = 0, чтобы упростить написание ваших запросов, и не требовать поиска MAX (версии) в каждом запросе.Убедитесь, что все дочерние таблицы также содержат столбец Версия и ссылаются на него в своих внешних ключах.Перед обновлением скопируйте данные Version = 0 из всех связанных таблиц в Version = 1.Следующее обновление будет копировать в версию = 2 и так далее.В конечном итоге у вас будут самые старые данные в версии = 1, самые последние в версии = 0 и самые новые в версии = X.Таким образом, вы можете создавать сложные схемы базы данных, управлять версиями данных и иметь возможность полностью откатывать данные до исторической версии, копируя данные из Версии = X в Версию = 0.

В вашем случае, ваша новая структура таблицыбудет ...

Версия, id, firstName, secondName, address (PK- VersionId, id)

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

Версия, id, TransactionId, Amount (PK- VersionId, id, TransactionId)

Я использовал этот метод дляведение версий данных без необходимости создавать дополнительные таблицы для их поддержки.

1 голос
/ 28 февраля 2012

Этого можно достичь, сохранив все исторические данные и имея столбец group:

id, firstname,secondname, address, group

, затем, когда вы обновляете данные, вы никогда не ALTER его, вы просто добавляете новую ревизию.

Итак, ваша таблица будет выглядеть следующим образом:

1, Ted, Wong, Hong Kong, 1
2, Ted, Wong, US, 1

Таким образом, чтобы получить текущие (или последние) ревизии, вам нужно выбрать соответствующую ревизию:

SELECT TOP 1 * FROM <table> WHERE Group = 1 ORDER BY id DESC
...