2013-03-07 37 views
0

我是數據庫設計的新手,我有關於爲我的項目選擇觸發器與視圖的問題。下面是一些細節:使用觸發器與視圖獲取當前數據狀態

數據庫使用:MySQL的

Table 1: 

Name: - no limit on number of values 
Level: - four values are possible - 1,2,3,4 
Status: - four values are possible - a,b,c,d 

每個名稱(不是強制性的,但有可能)的保持水平和狀態的所有組合。

例子:

名稱: 「王」 可以容納1級狀態,1級狀態b,......,2級狀態,2級狀態b ..... Level3的狀態a,級別3,狀態b .....

現在我必須查詢數據庫以進行一些計算,以便通過在網絡上運行的GUI(Java Swing)將它們顯示給用戶。我需要的計算是...

  1. 每個名稱的每個級別的每個狀態的計數。例如:

    國王級別1有多少「狀態a」。 國王級別1中有多少「狀態b」。 King級別1中有多少「狀態c」。 國王級別1有多少「狀態d」。 國王級別2中有多少「狀態a」。 等等....

    名稱--- ---級狀態

    王--- 1 ---一個

    王--- 1 ---一個

    王--- 1 ---一個

    王--- 1 --- b

    王--- 1 --- b

    國王--- 1 --- d

    等級2然後不同的名字也。我想的在1級計數的名字「王」

如果我執行單獨的查詢得到這個數據,我需要執行320個查詢,如果我有20名。我不想要。我在這裏有兩個解決方案...

解決方案1.我創建了一個觸發器。

我創建表2:

Name,Level,a_count,b_count,c_count,d_count 
    King 1  3  2  0   0 
    xyz 1  ... ..... ....  ... 

當原始表1被更新觸發相應增加了計數。現在我直接從這張表2中讀取。

解決方案2:創建一個顯示此數據的視圖。

名稱 - 級 - 狀態 - 計數

王1一3

王1 B 2

王2 ...

所以上。

有了這個解決方案,我不需要通過網絡發送所有的查詢。我可以只調用一次視圖(它確實執行所有查詢,但不需要從程序中執行)

我可以實現這兩個,但我想知道哪個解決方案更高效。每個用戶(使用我的前端)在父表中會有大約2000行,用戶可以是任何數字。請建議。

感謝, 拉朱

+0

有人請讓我知道觸發器和視圖之間可以使用什麼來獲取父表中的彙總數據? – Raju 2013-03-07 17:03:12

回答

0

最後我做了一些調查研究,並選擇使用觸發器。原因如下:

需求:需要的是每當用戶需要時獲取彙總數據。目前,對於20個不同的名稱,每次用戶請求數據時,我需要執行320個查詢。所以這裏的重點是用戶請求數據的次數。在我的申請中,他非常頻繁地提出要求。

因此,對於視圖:數據庫無論如何都必須執行所有查詢。所以我最終在每次用戶請求數據時執行320個查詢。

使用觸發器:我需要爲每個行更新執行一個更新查詢,這將使每個更新執行大約2個查詢。我最多有2000行,我最終會在用戶更新所有行時執行4000個查詢。但是,當用戶每次需要數據時,我只執行一個查詢來獲取所有數據。這樣,將數據庫負載的用戶(單個或多個)因素已經最小化。

我在網上發現了很多關於比較觸發器和視圖的討論,這些討論都偏向於不使用一件事情,但我瞭解到,只要應用程序在不增加數據庫負載的情況下保持其可伸縮性,任何東西都可以使用。由於DB上的負載是某個(x)因素用戶的使用,所以這個「some(x)」應儘可能小。

如果我的理解錯了,願意學習,請糾正。

感謝, 拉朱

0

「如果我執行單獨的查詢得到這個數據,我需要執行320個 查詢,如果我有20個名字。」

是的,但你不不需要執行單獨的查詢:您需要一個查詢,其彙總COUNT namelevelstatus

select name, level, status, count(*) 
from your_table 
group by name, level, status 

Find out more