2012-07-19 67 views
0

我們有一個數據庫表,有太多的行。爲了加快性能,我們正在嘗試創建一個彙總表。這對於一對一的關係非常有用。例如假設furniture有一個type和一個manufacturer_id,您可以擁有一個包含這兩列和一個counts列的表。查詢該表很容易,並能很快得到給定類型的傢俱數量。有沒有辦法爲多對多關係創建一個彙總表?

但是,如果存在多對多關係呢?所以每件傢俱也可以有一個或多個colors以及一個或多個distributors。那麼會發生什麼?有什麼方法可以總結這些數據,這樣我就可以快速找到有多少傢俱是綠色的?或多少藍色和黃色?

顯然這只是一個編造的例子。但給了一個巨大的數百萬和數百萬行的數據庫表,我如何創建一個彙總表來快速查找彙總信息?

回答

0

多個表應該保持較小的尺寸......良好的數據庫系統應該保持性能。

在我看來,保留一個單獨的「彙總表」會產生很多開銷和維護問題,並且只有反覆使用相同的彙總信息纔會非常有用(例如,有多少傢俱是綠色的,許多是藍色的,多少是黃色的,藍色和黃色的多少等等,等等。)

我會做的是:

表1:傢俱

  • 1列:UNIQUEID
  • 2列:命名

表2:經銷商

  • 第1列:uniqueID
  • 第2欄:名稱

表3:色

  • 第1欄:UNIQUEID
  • 第2欄:命名

表4:傢俱分配器

  • 第1欄:furnitureUn iqueIDvalue
  • 2列:distributorUniqueIDvalue

表5:傢俱顏色

  • 1列:furnitureUniqueIDvalue
  • 2列:colorUniqueIDvalue

多少傢俱是綠色:

SELECT COU NT(*)FROM furniture-color WHERE colorUniqueIDvalue ='green ID';

多少傢俱都是藍色和黃色:

SELECT COUNT(*)FROM傢俱顏色爲T1 INNER JOIN傢俱顏色爲t2 ON t1.furnitureUniqueIDvalue = t2.furnitureUniqueIDvalue AND t1.colorUniqueIDvalue =「藍ID'AND t2.colorUniqueIDvalue ='yellow ID';

通過正確的SQL語句(留給讀者的練習),可以獲得藍色和黃色傢俱的分銷商列表,或者來自特定分銷商的傢俱或綠色或紅色的傢俱,或大多數其他物品。

+0

因此,如果我的理論傢俱企業擁有2億件傢俱,會發生什麼?那麼傢俱分銷商和傢俱的顏色將甚至超過2億行,並試圖查詢哪些傢俱來自經銷商'ikea',而'紅色'和'黃色'將永遠(或更長)。因此彙總表...能夠快速查詢彙總數據的原因。 – user1315943 2012-07-19 18:32:29

+0

生成彙總表可能是您需要的解決方案,但請記住,您有創建和維護它們的開銷,並且您將不得不提前猜測多對多關係的每種可能組合。我還會指出,傢俱分銷商和傢俱色表每個只有兩個領域。即使你有十億條記錄,所需的磁盤空間仍然會小於我上週末在航展上拍攝的數字照片的空間。 – LavaSlider 2012-07-25 05:33:01

+0

這不是我擔心的磁盤空間..它正在查詢一張有十億條記錄的表 – user1315943 2012-07-25 21:11:54

1

假設你知道你在做什麼,並知道這是一個真正的瓶頸:你現在有衡量表現嗎?你知道從哪裏開始花時間嗎?

無論如何,您將不得不查詢數據庫以獲取該數據。因此,您可以將其存儲在單獨的表格中,如顏色計數和分配器計數。另一個解決方案是將這些查詢的結果緩存在緩存系統中。例如,如果你有memcached或其他一些工具已經在使用。

最簡單的,當你只是有一個數據庫僅僅是創建一個表:

table color count 
color_id 
amount 

這是一個非常簡單的查詢。您可以非常好地編制索引,不需要連接。

更新可以使用觸發器,使用cron或在更新多對多表格時完成。取決於你的需求和能力。考慮到更新記錄也需要時間,所以用它來優化讀取,這就是我在你的問題中讀到的內容。

+0

顏色計數表可以在一對一的情況下完美運行(我們實際上已經這樣做了)。但它對許多人來說又是如何工作的?我怎麼能夠找到藍色和黃色的傢俱? – user1315943 2012-07-19 18:35:35

+0

如果你需要尋找真正的記錄,那麼不是藍色和黃色傢俱的數量,那麼你將不得不加入原始記錄。如果您只需要計數,則可以將其存儲在例如2個字段中:color1_id color2_id。然後,您先訂購最小的顏色代碼。所以你可以搜索:SELECT amount FROM colorcount WHERE color1_id = 222 AND color2_id = 333。無需加入,分組或任何其他。但首先,在設定之前考慮一下真正有必要的東西。 – 2012-07-20 11:00:08

+0

但這是一個*多對多的關係。一件傢俱有很多顏色。如果我想檢查傢俱是如何變成綠色,紅色,藍色和黃色......那麼......我需要4色的cols? – user1315943 2012-07-23 18:33:16

0

您需要區分計算不同類型的傢俱(不同的傢俱編號)和計算實際傢俱的數量。

如果您有分配器顏色表,那麼您可以計算實際的傢俱。但是,您無法計算不同類型的傢俱。這是OLAP術語中加法事實和非加法事實之間的區別。如果您對這個主題感興趣,請查看Ralph Kimball和他的經典着作「數據倉庫工具包」。

要計算傢俱類型,您需要將其包含在您的表格中。所以,你需要一個分配器顏色傢俱表。我們得到總的經銷商,你可以使用:

select distributor, count(distinct furnitureid) 
from dcf 
group by distributor 

也是類似的顏色。

您似乎想要將您的原始數據轉換爲事實數據表中的每個報告。這對於開發數據集市來說是一個非常好的標準理念。你的數據集市可以有兩個事實表。每種類型的傢俱一個(所以你可以輕鬆地處理製造問題)和其他分配器顏色傢俱(用於更難的問題)。

某些數據庫(如Oracle和SQL Server)支持這些類型的數據結構。你所說的更像是一個新的「系統」,而不僅僅是一個新的「表格」。您需要考慮事實表的維度,更新以及您需要的報告類型。

0

將會有2^n顏色彙總表中的可能行,其中'n'是顏色的數量。如果減少顏色爲位圖,並指定每個顏色的位置(紅色= 0,橙= 1,黃色= 2,綠色= 3,等等),那麼你的顏色彙總表可能是:

Color Count 
0x0001 256 
0x0002 345 
0x0003 23839 
etc. 

256只有紅色,345只有橙色,23,839有紅色和橙色。要計算有多少紅色,但可能有其他顏色,則需要對位置0設置的行進行求和。另外一個單獨的彙總表可以設置爲只有'n'條目,每種顏色一個,以避免彙總行。

如果你想要彙總表來管理分銷商和顏色,那麼我認爲它會有2^n * 2^m行(其中'm'是分銷商的數量)具有所有多重組合可能有多種顏色的多件傢俱的分銷商。

相關問題