Вот модель данных
Table A (
name char (32) not null,
effdt date not null,
effseq int not null,
effstatus char (1) not null,
other data columns ..
)
Primary_Key A_Key (name, effdt, effseq);
Вот данные:
'A', '1/1/2009', 1, 'A', 'Otherdata'
'A', '1/1/2009', 2, 'A', 'Otherdata 2'
'B', '1/1/2009', 1, 'A', 'B data'
'B', '1/1/2009', 2, 'I', 'B Data'
Вот правила:
Используйте Effdt для хранения даты, когда строка должна использоваться или вступать в силу. Возможно, это не дата, когда данные хранятся / создаются.
Используйте Effseq для хранения нескольких обновлений на любую дату. Всегда следует начинать с 1.
Используйте EFFStatus для инактивации данных. Никогда не удаляйте данные в эффективной устаревшей схеме. Удаление также усложняет задачу аудита.
Когда вы «обновляете» строку, никогда не обновляйте столбец EFFDT. Всегда создавайте новую строку с новым EFFDT. Если EFFDT уже существует, используйте следующий EFFSEQ.
Это может быть хорошей идеей, чтобы сохранить updateuserid и updatetimestamp также в строке. Особенно, если вы хотите отслеживать изменения.
Вот вопросы:
Чтобы получить все данные:
Select * from A
Чтобы получить все "активные строки" на сегодняшний день:
Select * from A A1
where effdt = (select max (EFFDT) from A where name= A1.name
and effdt <= getdate())
and effseq = (select max(effseq) from A where name=A1.name and effdt=A1.effdt)
and eff_status = 'A'
Чтобы получить все строки на указанную дату прошлого / будущего:
Замените getdate () на фактическую дату, указанную выше.
Если вы пишете веб-приложение, вот правила поля формы:
Вставить форму:
EFFDT : Editable, Default Value = Today
EFFSEQ : Non Editable, Default Value = "#Next".
Interpret what is "Next" in the backend.
Форма обновления:
EFFDT : Editable, Default= current Value.
EFFSEQ : Non-Editable, Default = "#Next"
Удалить форму:
All data non editable, On Delete Action, set EFF_STATUS='I'
История Редактировать:
This is a "super user" feature only.
EFFDT = Non Editable, Default is Current Date
EFFSEQ = Non-Editable, Default is Current Value
Все остальные поля доступны для редактирования, и выполняется настоящее обновление строки.