Oracle创建表来处理valid_from和valid_to数据

时间:2013-01-30 06:00:20

标签: oracle create-table

我正在设计一个包含两列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)

除了确保所有开发人员/最终用户都了解此规则之外,还有更好的方法来实现此目的。非常感谢。

1 个答案:

答案 0 :(得分:1)

有一组称为slowly changing dimensions (SCD)的实现方法可用于处理此类存储。

您目前正在实施的是SCD II,但还有更多。

关于你可能的间隔重叠问题 - 没有简单的方法来强制表级(而不是行级)与标准约束的一致性,所以我想一个强大的方法是将直接DML限制到这个表并包装它进入一些标准化的pl / sql API,它将在插入/更新之前强制执行你的riles,并且每个开发人员都会使用它。