2012-02-21 18 views
1

我正在爲數據庫設計一個允許對歷史事務進行查詢的設計,而且我很難理解這個特定的問題。如何建立列的可選分解模型

要存儲的列之一是,比方說,每天的銷售數量(要被各種屬性細分)。根據最近的數據,我們可以將其分解爲在線和店內銷售;然而,在某個切斷點之前,可用於填充該數據庫的唯一信息是總銷售數字,沒有明細。

我想不出一種特別優雅的方式來表達這種情況,以便更新的數據可以填充邏輯「在線銷售」和「店內銷售」列,其中「總銷售額」計算爲他們的總和在視圖/ sproc /計算列中) - 而舊數據只能報告總銷售額。

此數據的FWIW客戶將會意識到銷售細分可能存在或可能不存在 - 因此,查詢的輸出始終具有有效的「總銷售」數字,並且可能缺少在線或在線內容的值。商店銷售。 (我特別說「缺少」而不是「空」,因爲沒有強烈的要求將其表示爲這樣,如果替代更有意義)。

是否有規範的方法來處理這種情況?


由於缺乏有力的反應,到目前爲止,我會後我自己的幾個答案,我看到的考生(我可能最終需要接受他們的一個無論如何,如果沒有上級的答案兌現)。評論,批評和/或投票對這些都是慷慨地接受 - 特別是對他們的改進。

回答

0

第三種方法是將銷售數據建模爲與觀察到的事實的多對一關係;也就是說,每個事實包含多個(可能只有一個)銷售數字,每個銷售數字都有一個特定的類型。在這種情況下,總銷售額只不過是任何數字的總和。

所以該模式可能是這樣的做法

DataFact 
------------- 
DataFactId (PK) 
(+any other fact columns apart from sales) 

SalesData 
--------- 
DataFactId (FK to DataFact) 
SalesDataType ("Total"/"Online" etc - either as varchar or FK to dimension table) 
SalesValue (the actual sales figure we want to record) 

優點是,它抓住,對於給定的事實,它可能會或可能不包含任何具體的銷售數據實體的概念。它也抽象出只是變化的字段,這意味着任何公共字段仍然只在父DataFact表中表達一次(與separate fact tables不同)。如果未來有更多可用的銷售細分,那麼擴展也是微不足道的。

缺點是,它仍然沒有表示總的或在線+店內必須存在的限制。事實上,我們甚至不能表示至少有一個SalesData條目必須存在;這與添加多個可爲空的字段具有相同的問題。雖然這種方法非常簡潔,但要充分利用其靈活性,我們希望將銷售數據作爲某種集合提供給查詢客戶端,這使得查詢比標準2D結果集更復雜。它可能被壓縮回到一個二維表,使用聚合在SalesData表,但我相信你不得不多次拉它與不同的約束,以確定每個領域。

0

我可能會添加一個「銷售版」表,它可以區分「歷史性的非易碎性銷售」和「較新的銷售」。

所以,也許這種結構可以實現:

sales_version表

列:salesid,salesversion

sales_v1表

列:salesid,日期時間

我假設對於每次銷售,詳細信息都在從屬表中,該表指出銷售人員

sales_v2表

列:salesid,日期時間,網絡,店內或許salesid,日期時間,類型(「在線」或「店內」),或itselfs指銷售型表ID類型。

我想每個銷售,詳情是在那個指的salesid

1

你所描述是OLTPOLAP數據庫之間的差異從表。

OLTP線上交易處理)這種類型的數據代表的日常事務。例如庫存添加,更改刪除。客戶添加到購物車的請求,訂單,退款。這些是整天發生的基本事務。

OLAP線上分析處理)這種類型的數據代表了給定的時間週期累積的數據。例如:每日,每週,每月,每季度,每年。購買將此信息存儲在單獨的一組表或數據庫中,您可以運行不同的查詢來爲您提供所需的報告。

你能碰到的問題是,當你想OLAP信息時,你已經是OLTP數據。

如果你想每天的銷售額由單獨的類別,然後創建一組每天OLAP表,每天晚上運行一個單獨的進程或一組歸檔過程關到這些表中的數據。

每個月您都可以運行不同的流程來創建每月OLAP表。

起初的工作很多,但它給你兩全其美。如果遊戲整天與您的OLAP數據相互作用,而不會影響客戶或日常操作,您可以玩這些遊戲。

+0

是的,這絕對是我設計的一個面向OLAP的數據庫。但是我覺得你的回答並不完全涵蓋我的模式,即幾個月後我可以提供'在線銷售'和'店內銷售'(並且希望計算總計)。在其他幾個月裏,我只有'總銷售額'。 OLAP事實表中應該有三個可爲空的列嗎?事實表的兩個「子類」?事實和與之相關聯的'(Sales figure type,value)'元組之間的一對多關係? – 2012-02-22 10:17:23

+0

事實上,我剛剛添加了一個答案來表示我一直在考慮的這些技術,我會很感激你對哪一種技術最適合OLAP數據的想法,以及如何改進其中的任何技術。 – 2012-02-22 10:51:29

+0

爲什麼有些月份只有總銷售額,而不是在線和店之間的分解? – 2012-02-22 16:35:42

0

一種方法是簡單地具有存在的事實表中的所有三列,併爲他們所有可爲空。對於較新的數據,只填寫兩個更具體的銷售數據列,對於舊數據,只填寫總銷售額。

查詢時,總銷售價值可以有條件地填充,是這樣的:

CASE WHEN TotalSales IS NULL THEN OnlineSales + InStoreSales ELSE TotalSales END 

這具有從應用的角度看,最簡單的優點。儘管從數據建模的角度來看,我不喜歡每隔記錄將至少留下一個字段爲空的事實。並且難以表達數據完整性約束,即必須填充TotalSales都必須填充OnlineSalesInStoreSales。用觸發器檢查是否被認爲是良好的做法?

(替代版本,這是填充,即使在新的情況下,TotalSales領域,但我不認爲可能不一致數據的重複和風險是值得的稍微簡單的查詢。)

0

另一種可能的方法應該有兩個不同的事實表,每一個用於舊數據和新數據,並根據每種情況下確定可以確定的數據對這些數據進行建模。

對於查詢,總體結果將是來自兩個事實表的數據的聯合 - 對於特定銷售數據列,從舊事實表中選擇填充NULL(或類似)。

這種方法很好,因爲它準確地模擬了我們正在記錄的數據(並且能夠記錄),但是如果兩個表格除銷售列以外都相同,則可能會導致字段的大量重複, 。另外,我有一個(非限制性)的感覺,當使用兩個表的聯合時,數據庫將很難用索引來做有用的事情,這樣查詢性能可能會受影響。