2012-09-10 46 views
3

是否可以基於entity attribute value數據庫創建數據倉庫?如何基於實體屬性值數據庫構建數據倉庫?

如果是這樣,怎麼樣?

基本上我有以下格式的數據:

id name value 
---------------- 
1 name1 10 
1 name2 20 
1 name3 30 
2 name1 40 
2 name2 50 
2 name3 60 
... 

,而不是執行以下操作:

id name1 name2 name3 
-------------------- 
1 10 20 30 
2 40 50 60 

我的問題是,有沒有名字/措施,我可以把特定的一組在事實表中。

name1name2name3提前不知道(甚至沒有多少人會存在)。

關於如何解決這個問題的任何想法?我在互聯網上搜索,但無法找到任何相關信息。任何幫助非常感謝...

注意:我沒有任何建立數據倉庫的經驗。我目前正在讀: 數據倉庫ETL工具包:實用技術提取,清理,整合和傳遞數據(由拉爾夫·金博爾)


所以回答Ben (from comments):「你的表實際上是標準化的。 ..爲什麼要取消它正常化

龍回答
我們的客戶使用一個工具,允許他將它從OLAP多維數據集落尺寸&措施,在工作區,然後表演他選擇的數據。

如果我使用the model Paul Grimshaw suggested,客戶需要在工作區中拖動名稱,然後爲名稱添加過濾器,例如與name1(如果他願意的話)相同。

另一方面,如果客戶有一個他可以在工作區中拖動的名稱列表,他只需要一個動作(易用性)來訪問與name1(僅舉例)相關的數據。還有一個原因:可發現性。客戶可以查看可用名稱列表,只需從中選擇名稱,而不是爲名稱添加過濾器(並且他需要知道確切的名稱)。

簡短回答:易於使用的客戶(其中包括名稱的可發現性)。

+0

我忘了提及名稱1,名稱2和名稱3是事先不知道的(甚至沒有多少可能存在)。 –

+1

@Ben將元數據放入列不是規範化。這只是[糟糕的設計](http://tkyte.blogspot.com/2009/01/this-should-be-fun-to-watch.html)。 –

+0

@IgorPopov每個不同的「名稱」有不同的,不同的商業含義嗎?因此,對於產品ID 1,其具有稱爲「重量」的「名稱」,其具有度量50,並且具有稱爲「長度」的「名稱」,具有度量25? –

回答

1

在報告關係模型時處理實體 - 屬性 - 值結構非常棘手,不必介意維度模型。

我們通過建立「屬性」欄中的「動態屬性」表處理這個 - 在這種情況下,「名稱」列」

從本質上講,在批量ETL過程中,我們刪除舊的表,並創建一個新的DDL,新的DDL是通過從(在你的情況下)「名稱」列中選擇不同的值生成的,然後在數據庫上作爲動態SQL運行,然後ETL動態地創建UPDATE INSERT或與每一列從EAV表加載此表的語句,喜歡的東西:

IF id doesn't exist in table, then: 

INSERT INTO DYNAMIC_PIVOT_TABLE (id, $name) 
    SELECT id, value as "$name" where name = "$name"; 

ELSE 

UPDATE DYNAMIC_PIVOT_TABLE ... etc 

對於$名稱的每一個值,我們執行一次插入或更新以將EAV數據的「子集」加載到適當的列中。

現在你已經有了一個「事實」表,其中一個維度(ID)和其餘項目的度量。

但是,如果「名稱」中的某些內容不是度量值,而是尺寸屬性,則會變得更糟。然後你必須做一些瘋狂的邏輯來確定什麼是度量和屬性。另外,許多OLAP工具需要「靜態」元數據 - 動態變化的元數據可能會給他們帶來問題。

+2

另外 - 我將從Ralph Kimball的早期着作「數據倉庫工具包」開始,詳細地介紹了一些很好的示例以及維度模型的工作原理。 –

+0

感謝您的參考和您的回答......不幸的是,我不得不處理「動態」元數據(一些來自帆船的關鍵值對,每艘船都有一組不同的傳感器)。由於「動態」部分,我們無法將特定鍵(初始文章中的「名稱」)並排比較。這些要求存在一個相當大的問題,因爲對於我可以進行分析的所有船舶至少應該有一組鍵('name')。 –

+1

@IgorPopov所以他們要求「並排」分析,即使數據不支持:-)。您可能只想識別所有船舶的每個可能的維度,然後對於沒有適當傳感器的船舶,這些度量和屬性在事實表中被忽略。這樣,你根本不必建立一個動態的事實(我希望這個結構不會經常改變,因爲船舶很大,並且增加一艘新船可能一年或兩年發生一次?) –

0

如果我理解正確,您可以使用「id」作爲事實表的關鍵字以及「姓名ID」。

這會給你兩個維度(id和name),一個事實表有兩個鍵(id和nameid)和一個值字段。

+0

我不確定名稱維度是否有意義...至少我沒有發現它記錄在任何地方...無論我看,我找到例如日期和時間尺寸或產品尺寸... –

+0

嗯,好吧,是的,我想我可以使用名稱維度。 –