在Oracle中存储每周和每月聚合

时间:2012-01-21 17:06:21

标签: oracle database-design oracle9i

我需要动态更新每个产品和客户的每周和每月销售数据。这些需要在产品销售期间进行更新和检查,由于各种原因,我无法使用存储过程或物化视图(我会将所有内容读入应用程序,修改内存中的所有内容,然后更新和提交结果)。

在一段时间内保持销售的最佳表格结构是什么?

  • 使用开始日期和结束日期存储期间类型(M,W),还是仅存储类型和开始日期?
  • 使用日期字段和字符,或将其编码为字符串('M201201'/'W201248')
  • 将销售和期间标准化为两个表,或者将销售和期间保持在一个表中?

我将进行两种查询 - 选择当前每周(xor月)期/客户/文章的销售但不更新它们,并选择更新客户/文章的每周和每月期间。

2 个答案:

答案 0 :(得分:1)

如果您在行中存储适用期间的开始日期和结束日期,那么您的检索查询将更加容易,至少是基于单个日期(如今)的查询。这是一种非常典型的访问模式,因为您可能会从在特定日期发生的业务交易(如特定销售)的角度来看待事物。

where @date_of_interest >= start_date and @date_of_interest <= end_date是非常直接和简单的。任何其他组合都要求您在转到查询之前或在查询本身之前在代码中进行日期算术。

保持类型代码(M,W)以及开始和结束日期都需要引入一些冗余。但是,您可以选择引入此冗余以简化数据检索。这:where @date_of_interest >= start_date and @date_of_interest <= end_date and range_type='M'也非常直接和简单。

与所有非规范化一样,您需要确保拥有可以管理此冗余的控件。

答案 1 :(得分:0)

我建议您使用规范化架构,将每周和每月聚合存储在具有相同结构的两个不同表中。我不知道你要做的那种查询,但我想这会让你更容易进行任何类型的搜索(当它以正确的方式完成时!)。

可能类似这样的样本

product_prices (
    prod_code,
    price,
    date_price_begin
);

sales (
    prod_code,
    customer_code,
    sale_date
);


<aggregate-week>
select trunc(sale_date,'w') as week,
    prod_code,
    customer_code,
    sum(price) keep (dense_rank first order by date_price_start) as price
from sales 
    natural join product_prices
where sale_date > date_from
group by trunc(sale_date,'iw'),
    prod_code,
    customer_code
/

<aggregate-month>
select trunc(sale_date,'m') as month,
    prod_code,
    customer_code,
    sum(price) keep (dense_rank first order by date_price_start) as price
from sales 
    natural join product_prices
where sale_date > date_from
group by trunc(sale_date,'m'),
    prod_code,
    customer_code
/