1

我正在设计一个表,其中包括两列 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设置为旧描述不再有效的日期,并创建一个新行有效的_来自。但是我怎样才能确保这两行之间永远不会有重叠。例如,下面的查询应该只产生一行。

select currency_desc
  from currency_data
 where currency_code = 'USD'
   and trunc(sysdate) between valid_from and nvl(valid_to, sysdate)

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

4

1 回答 1

1

有一组已知的实现方法slowly changing dimensions (SCD)用于处理这种存储。

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

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

于 2013-01-30T06:16:01.007 回答