2012-02-28 3 views
2

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

id, firstName, secondName, address 

обычно, создать профиль, полный в информации, и база данных будет что-то вроде этого :

1| Ted | WONG | Hong Kong | 

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

1| Ted | WONG | US | 

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

+0

Я надеюсь, что он был изменен через 'UPDATE', а не' ALTER' - какую базу данных вы используете? –

+0

Вы правы, я просто печатаю неправильно. MySQL. – DNB5brims

+0

Я добавил этот тег и удалил свой ответ, так как я не думаю, что он будет работать против MySQL. –

ответ

1

Это может быть достигнуто за счет сохранения всех исторических данных и имеющих 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 
+0

, но я использую идентификатор в качестве ключа для установления отношений с другой таблицей, например, у меня есть таблица пользователя с профилем, если я это делаю, когда у меня есть новая версия, мой идентификатор таблицы профиля изменяется, а Профиль_файла user table указывает на данные, не обновляемые. – DNB5brims

+0

Да, правильно, поэтому в этом случае вам лучше рационализировать структуру базы данных. Выберите столбцы, которые НЕ меняются, и вставьте их в первую таблицу. Затем вы можете поместить данные профиля в другую таблицу и использовать схему, аналогичную моей или KAJ, и выполнить соединение с данными, используя последнюю версию или номер версии. – Simon

3

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

where versionNo = (select max(versionNo) from table where id = <outerTableAliasOrVariable>.id) 
+0

Выполнение max (verionNo) для каждого запроса может действительно ухудшить производительность, когда вы получить много данных. Я делаю что-то подобное, за исключением того, что предпочитаю обновлять версию 0 и архивировать все данные в версии X до любых обновлений. Это делает запрос намного проще. –

1

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

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

версия, идентификатор, ПгвЬЫат, secondName, адрес (Pk- VERSIONID, идентификатор)

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

версия, идентификатор, TransactionID, Сумма (Pk- VERSIONID, идентификатор, TransactionID)

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

Смежные вопросы