2016-03-11 2 views
0

У меня есть таблица, содержащая несколько версий каждой записи, например Id = 1 имеет две записи, я планирую добавить столбец «STATE», в котором будет отображаться последняя запись из всех версий. поэтому последняя запись будет иметь STATE = 1 и все старые записи будут иметь STATE = 0.Столбец состояния в таблице базы данных

Id NAME STATE 
1 Test1 0 
1 Test1_1 1 
2 TEST2 1 

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

+1

Google «таблицы sqlingingings sql» и более общие «временные данные sql». – philipxy

+0

Плохой дизайн. Каким будет ваш первичный ключ? Я предлагаю нечто вроде 'things_current (id PK, version FK)' и 'things_history (id PK/FK, version PK, name)'. – reaanb

+0

Эта статья объясняет, что я ищу, она называется «Медленное изменение размера» https://en.wikipedia.org/wiki/Slowly_changing_dimension –

ответ

0

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

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

0

Я не знаю общепринятого названия, но для этого вам не нужно имя. Если он чувствует себя хорошо, кодируйте его.

Я делал это по случаю. Обычно у меня есть какой-то номер версии или дата обновления. Теоретически вы можете написать запросы, чтобы найти запись последней версии, выберите max (version_stamp) или некоторые из них. На практике это боль, обычно требующая внутреннего запроса, чтобы найти нужную запись, а затем внешний запрос, чтобы перечитать эту запись. Таким образом, это один из немногих случаев, когда я переношу лишние данные и добавляю «текущий» флаг.

Возможно, вы захотите сделать первичный ключ равным id + current, так что вы можете найти текущую запись без сканирования.

Альтернатива, которую я использовал один раз, и я думаю, что мне нравится, но я все еще обсуждаю: есть одна таблица с полными данными и уникальным идентификатором. Иметь другую таблицу с идентификатором «reference», а затем FK для полных данных. Например:

customer_data (customer_data_id*, date_stamp, name, address, credit_card_number, whatever) 
customer (customer_number*, customer_data_id) 

Затем, когда customer_data обновляется, мы создаем новую запись (с новым и несвязанной customer_data_id), дать ему date_stamp и обновить клиент, чтобы указать на этот новый рекорд.

Каждый раз, когда мы хотим, чтобы customer_data, мы читаем его, присоединяясь к клиенту.

select name, address 
from customer c 
join customer_data d on d.customer_data_id=c.customer_data_id 
where [email protected]_number