2012-09-17 19 views
1

我正在爲我工​​作的學校寫一堂課觀察系統。使用刻度框時,我應該使用序列化數組還是單獨的數據庫表?

數據庫結構如下所示:

Database structure

我目前正在開發的Observations表中的輸入形式和不少的領域都需要打勾盒。例如,Focus字段可以是12個選項中的任意數量; PositiveNegative字段每個可以是近二十個選項的任意數量。

在上面的圖片中,我用VARCHAR來允許serialize'd數組。

但是,我開始懷疑這是否是最佳路線,尤其是考慮到我可能想對數據進行一些半複雜分析,如top 5 staff for a specific positive attribute such as behaviour(這將涉及統計behaviour屬性的數量每名工作人員根據Observations表中的Positive字段)。

這裏有兩個問題;

  • 我應該使用額外的表嗎?對於Focus我會想象第一個表有三個字段 - ID(鍵和自動增量),Observation_IDFocus_IDFocus_ID將與另一個表focii或其他簡單地具有兩個字段的表-Focus_IDTitle相關聯。我需要兩張表Focus和三張表Positive/Development(相同的選項,但不同的日誌記錄)。
  • 如果我使用這些額外的數據庫表,將我的SQL語句是什麼努力來檢索Observations表包括所有相關focusespositivesdevelopments的信息時是怎樣的?

由於提前,

+0

+1清晰的數據庫方案的問題和圖像。 – Sherlock

回答

3

是的,你應該總是正常化這種情況。如果你想做計算甚至修改,存儲序列化的數據是非常糟糕的。 (你怎麼會刪除第三元素?)

實例查詢:

SELECT 
    o.id, 
    COUNT(f.id) AS number_of_focusses 
FROM 
    observations o 
INNER JOIN focuses f 
    ON f.observation_id = o.id 
GROUP BY id 

這會給你的「焦點記錄」屬於每個觀測的數量。

+0

啊,是的,我甚至沒有考慮過去除元素!謝謝羅賓。 – dunc

+0

羅賓,我將如何去包含該SQL語句中焦點的標題?即如果我有一個名爲「焦點」的表格,它記錄了所有與觀察有關的焦點,但是還有一個名爲「focus_labels」和「ID」和「標題」的表格? – dunc

相關問題