我正在设计一个包含两列valid_from和valid_to的表来跟踪历史变化。例如,我的表结构如下所示:
create table currency_data
(
currency_code varchar(16) not null,
currency_desc varchar(16) not null,
valid_from date not null,
valid_to date,
d_insert_date date,
d_last_update date,
constraint pk_currency_data primary key (currency_code, valid_from)
)
我的想法是将valid_to保留为空白,如果将来更改currency_desc,我需要将valid_to设置为旧描述无效的日期,并创建新行使用新的valid_from。但是我怎样才能确保这两行之间永远不会重叠。例如,下面的查询应该只生成一行。
select currency_desc
from currency_data
where currency_code = 'USD'
and trunc(sysdate) between valid_from and nvl(valid_to, sysdate)
除了确保所有开发人员/最终用户都了解此规则之外,还有更好的方法来实现此目的。非常感谢。
答案 0 :(得分:1)
有一组称为slowly changing dimensions (SCD)
的实现方法可用于处理此类存储。
您目前正在实施的是SCD II,但还有更多。
关于你可能的间隔重叠问题 - 没有简单的方法来强制表级(而不是行级)与标准约束的一致性,所以我想一个强大的方法是将直接DML限制到这个表并包装它进入一些标准化的pl / sql API,它将在插入/更新之前强制执行你的riles,并且每个开发人员都会使用它。