Дизайн базы данных: отслеживание изменений записи - PullRequest
1 голос
/ 28 июня 2011

Транзакция не должна изменяться после ее обработки.

Данные плательщика могут меняться со временем.

Как вы отслеживаете изменения?

TRANSACTION 
Id(PK) 
PayerId(FK) 
...

PAYER 
Id(PK) 
... 
...

Ответы [ 4 ]

2 голосов
/ 28 июня 2011

Есть несколько способов сделать это.

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

В качестве альтернативы вы можете перенормировать все эти данные в таблицу для отчетности.

Или как насчетновая таблица, которая ссылается на детали клиентов.При этом обновляется ссылка на новую строку, а на эту строку - ссылка на предыдущую строку.Таким образом вы сможете (медленно) извлекать свои данные.

1 голос
/ 29 июня 2011

Ваша лучшая ставка - сделать одну из двух вещей.Сохраните данные во время транзакции в таблице TRANSACTION или таблице TRANSACTION DETAILS.Это НЕ денормализует.Вам нужны данные по времени, когда они были получены, и оставить их как есть при присоединении к таблице PAYER, которая меняется со временем, что означает, что у вас будут неверные данные.Тот факт, что данные повторяются в нескольких записях, не более значим, чем CA, появится несколько раз в таблице адресов с полем состояния.Вам также следует сохранить идентификатор PAYER, чтобы при необходимости можно было просматривать текущие данные. Это самое простое решение.

Другое решение заключается в добавлении способа поиска данных на основе времени.Это более сложно и должно быть сделано очень осторожно, иначе вы потеряете целостность данных или получите очень странные результаты отчета.Лучше всего, если у вас есть соответствующие таблицы для Payor.Сначала настройте PAYOR, который в основном будет иметь PAYORID и PAYOR DETAILS, которые будут иметь данные на основе времени.Таким образом, вы можете применить ограничение внешнего ключа к PAYOR (чтобы вы могли просматривать текущие данные, если это необходимо), но при этом сохранять несколько записей в таблице PAYORDETAILS, когда происходит изменение адреса или имени и т. Д.Вы также хотели бы, чтобы даты начала и окончания каждой из этих записей и триггера гарантировали, что даты начала / окончания не перекрываются.Например, если у вас есть несколько адресов, это становится еще более сложным, потому что у каждого должен быть тип адреса, активным может быть только один (вы не хотите, чтобы в ваших отчетах показывалось, что вы отправили продукт на три адреса).Все ваши запросы должны учитывать дату начала и окончания, и обычно лучше настроить представление, которое всегда будет отображать только текущую запись.Этот сценарий гораздо сложнее настроить и поддерживать с течением времени, и гораздо более вероятно, что в нем будут ошибки, из-за которых у вас могут не быть правильные данные, связанные с транзакцией.

0 голосов
/ 28 июня 2011

Я бы настоятельно рекомендовал сделать "время" первоклассным понятием в вашей организации Плательщика. Решение «временной таблицы» Damien_the_unbeliever достигает этого, но есть альтернативные реализации.

В прошлом я решал подобные проблемы, добавив окно достоверности в таблицу плательщиков и сравнив дату транзакции с этим окном.

TRANSACTION 
Id(PK) 
PayerId 
TransactionDate
...

PAYER 
Id 
ValidFrom
ValidUntil
....

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

поворот на это будет:

TRANSACTION 
Id(PK) 
PayerId(FK) 
...

PAYER 
Id(PK)

PAYER_DETAIL
ID(FK)
PayerID (FK)
ValidFrom
ValidUntil
.....
0 голосов
/ 28 июня 2011

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

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

Для обновленных данных можно выбрать запись из Inserted Таблица

Для устаревших данных вы можете выбрать запись из Deleted Таблица

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

...