有效的仓储策略?六型?

Valid Warehousing Strategy? Type6?

作为一名数据库用户,我在解释我们 table 工作中的数据时遇到了问题。当我询问数据团队时,解决方案架构师告诉我这是故意这样做的,因为它是 "Type 6" table.

根据我有限的谷歌搜索,我认为 Type 6 应该是这样的:

+--------------+------------------+------------------+------------+------------+---------------------+
| Customer_Key | Customer_Attrib1 | Customer_Attrib2 | Start_Date | End_Date   | Record Updated Date |
+--------------+------------------+------------------+------------+------------+---------------------+
| 123          | 1                | A                | 1/1/2001   | 6/8/2004   | 6/9/2004            |
+--------------+------------------+------------------+------------+------------+---------------------+
| 123          | 1                | A                | 6/9/2004   | 4/11/2016  | 4/12/2016           |
+--------------+------------------+------------------+------------+------------+---------------------+
| 123          | 1                | A                | 4/12/2016  | 4/3/2017   | 4/4/2017            |
+--------------+------------------+------------------+------------+------------+---------------------+
| 123          | 2                | B                | 4/4/2017   | 5/18/2017  | 5/19/2017           |
+--------------+------------------+------------------+------------+------------+---------------------+
| 123          | 2                | B                | 5/19/2017  | 12/31/9999 | 5/19/2017           |
+--------------+------------------+------------------+------------+------------+---------------------+

问题中的 activity 是 Customer_Attrib1,它是如何在 2017 年 5 月 18 日从 1 变为 2 的。

我喜欢这种风格,因为我可以通过使用开始日期和结束日期来计算customer_attrib1在任何时间点是什么:

select customer_attrib1 
from table 
where customer_key=123 
and '2017-03-01' between start_date and end_date;

然而...

table本身实际上是在拖欠更新,看起来像这样:

+--------------+------------------+------------------+------------+------------+---------------------+
| Customer_Key | Customer_Attrib1 | Customer_Attrib2 | Start_Date | End_Date   | Record Updated Date |
+--------------+------------------+------------------+------------+------------+---------------------+
| 123          | 2                | A                | 1/1/2001   | 6/8/2004   | 5/19/2017           |
+--------------+------------------+------------------+------------+------------+---------------------+
| 123          | 2                | A                | 6/9/2004   | 4/11/2016  | 5/19/2017           |
+--------------+------------------+------------------+------------+------------+---------------------+
| 123          | 2                | A                | 4/12/2016  | 4/3/2017   | 5/19/2017           |
+--------------+------------------+------------------+------------+------------+---------------------+
| 123          | 2                | B                | 4/4/2017   | 5/18/2017  | 5/19/2017           |
+--------------+------------------+------------------+------------+------------+---------------------+
| 123          | 2                | B                | 5/19/2017  | 12/31/9999 | 5/19/2017           |
+--------------+------------------+------------------+------------+------------+---------------------+

如果我想去查找 2016 年 3 月的 customer_attrib1 是什么,你能看到我遇到了多少麻烦吗?

注意:一个previous_customer_attrib1列,但它也被大量更新为值1。我想保留table小到足以说明要点,这就是我没有在上面添加它的原因。

大问题:这是有效的仓储策略吗?这真的是Type 6吗?或者是我的解决方案架构师错了。

跟进问题:如果 customer_attrib1 是另一个 table 的外键,答案会有所不同吗?

你的第一个例子看起来像一个普通的 ol Type 2 SCD。第二个示例看起来像是属性 1 上的类型 1(覆盖)和属性 2 上的类型 2 SCD。

既不是呈现的类型 6,您可以在其中查看更改历史记录(按照您的第一个示例,以类型 2 的方式)以及当前值,通常通过为当前值保留一组单独的列,或通过链接到当前记录。您提到了前面的 attrib 1 列,这对于它成为 Type 6 至关重要。但是您不希望它也被批量更新,否则您只会得到一个以前的值,而您看不到任何变化在那之前。

不同的人对 Type 6 有不同的含义。在类型 6 中,您需要的只是值本身(当时适用于行)和当前值(发生更改时批量更新),以及(当然)类型 2 的创建方法每次更改的新行。

回答你的问题,是的,我可以看到你对给你的设计有多少麻烦。当且仅当它满足业务需求时,它才是有效的策略。这些技术仅用于帮助满足业务需求。

如果属性是外键,那么它会变得有点棘手,我们需要更多关于外键 table 如何跟踪历史记录的信息,以便能够回答这是否改变了什么。