Database-Design

為多個 FACTs 模式建模的正確方法

  • July 17, 2020

背景

我正在設計數據庫(使用 STAR 模式)。

有三個表要建模:productstestsstates

該數據庫將用於儲存對產品進行的**測試結果(非常簡化)。可以有許多測試指向單個產品,但每個測試都是唯一的(它們不在產品之間共享)。此外,我需要在進行測試時記錄產品的目前**狀態。讓我們假設產品的**狀態描述了它的目前位置和所有者,它們經常變化。這很可能涉及 SCD lvl 2 - 跟踪狀態變化的歷史並能夠定位產品連同它的所有測試以及它在這些測試中的**狀態

問題

我不完全確定如何為這個問題建模。將每個測試儲存在 FACT 表中似乎很明顯。然後,該表將包含數千個事務。另一方面,也會有成百上千的產品,所以我應該把它們放在第二個 FACT 表中。然後,還會有成千上萬的狀態變化,所以為了記錄它們的整個歷史,我還需要將它們保存在… FACT 表中?有人告訴我,FACT 表通常用於儲存多行數據,但另一方面,該模型中的 DIM 在哪裡?

我也不知道如何為這些表之間的關係建模。產品-狀態是 1:* 關係。產品-測試也是 1:。最後,states - tests也是 1: 。然後,我會將產品連結到狀態,然後將狀態連結到測試products 1<-* states 1<-* tests),這將允許我找到特定產品的所有**狀態和所有測試(在所有狀態或選擇狀態)。你怎麼看?這裡的問題是,當我不斷添加states時,我有兩個選擇:要麼在products表中繼續複製產品(添加“recorded_timestamp”列),要麼在states表中使用 SCD lvl 2,用一個 FK,但這會有效地使產品表變暗!

這裡的任何幫助將不勝感激。

首先,“star”和“fact”都不是縮寫,“dimension”也不是縮寫,所以它們不應該全部大寫。“事實表”之所以這樣稱呼,是因為它們包含事實。“星型模式”在以圖形方式表示時(對某些人來說)類似於星型,以防有許多維度描述一個事實。

一個產品不可能是一個事實,所以它是一個維度。狀態可能是事實,也可能不是事實,因此您應該更加仔細地查看該實體以確定它的真實情況。測試當然是事實。

根據您決定的狀態,您的模型將是兩點“星”,以產品狀態為維度,或者是單腿雪花。你也可以發現statetest的結合確實是一個事實,那麼你最終會得到一個單點的“star”。

引用自:https://dba.stackexchange.com/questions/270817