[英]What should update when an SCD1 change happens on an SCD2 aware table
我不確定 Kimball Data-Warehouse 文獻中是否回答了這個問題——我找不到答案。
假設您有一個表,其中包含幾個 SCD2 感知列和一些 SCD1 列。 問題很簡單:當 SCD1 列發生更改時,哪些記錄會更新?
您是否更改所有記錄,當前記錄和所有歷史記錄? 還是只更改最近的(打開的)記錄? 我傾向於“全部” go,而我所有的同事都堅持“僅最新”。
我可以給出我意見的唯一原因是,當我在業務鍵列或 SCD1 列上運行COUNT(DISTINCT...)
時,我希望它給出相同的結果。
想一想,有兩種特殊情況:如果一條記錄沒有當前版本,如果最新的一條出現在 scope 並且沒有新實例怎么辦? 如果我使用我的 SCD2 邏輯來准備將來會自動激活的記錄怎么辦?
如果我只更新最新的開放版本,那意味着我在第一個特殊情況下不會更改任何內容,而在另一種情況下,我需要更改所有未來(准備好的)記錄。 想一想……我相信“全部”是正確的答案。
誰能指出一個著名的白皮書網站(如 Kimball,Microsoft)給出答案?
全部。 類型 1 的意圖是事實與屬性的當前值相關聯:
https://www.kimballgroup.com/2013/02/design-tip-152-slowly-changeing-dimension-types-0-4-5-6-7/
在類型 2 SCD 中,事實與事實發生時處於活動狀態的維度的“版本”相關聯。 為了使與版本關聯的事實“與屬性的當前值關聯”,必須在維度的所有版本上更新當前值。
例如,如果你有
SalesFact(Date,CustomerId,Amount)
和
CustomerDim(CustomerId, CustomerBK, EffectiveDate, EndEffectiveDate, IsCurrent, Name, SalesPersonId)
如果您想將歷史銷售事實與客戶的當前銷售人員而不是銷售時活動的銷售人員相關聯,則必須為該客戶的所有版本更新 CustomerDim。 例如
update CustomerDim set SalesPersonId = 1234 where CustomerBk = 'Acme'
或者像這樣的查詢
select sum(Amount)
from SalesFact s
join CustomerDim c
on s.CustomerId = c.CustomerId
where c.SalesPersonId = 1234
不會退回該 SalesPerson 客戶的舊銷售額。
根據定義,必須在 SCD1 屬性更改時更新所有行。 如果您只更改最新版本,則它是 SCD2 更新。
如果您有大量版本行,您可以考慮將 SCD1 和 SCD2 維度拆分到單獨的表中。 這確實增加了事實(類型 4)的附加參考,或者需要將新的 SCD2 維度雪花化到新的 SCD1 維度。 這兩個選項都解決了對混合維度的更新問題。
該方法稱為緩慢變化的維度,而不是緩慢變化的屬性。 忽略更高級別的復雜性,維度是 SCD0,1 或 2 - 因此,如果 SCD2 維度中的任何屬性發生更改,則您將創建一條新記錄。
試圖使維度內的屬性具有不同的 SCD 級別只會讓您陷入您所描述的混亂之中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.