2011-11-02 44 views
3

我正在爲一所學科創建數據庫設計。我現在的設計是表現在接下來的環節:使用來自其他表格的數據創建計算字段

Database design http://img225.imageshack.us/img225/7711/capturecopyy.png

我已經封閉的三個實體和所有然後計算包含字段:

  • StudetExams:平均
  • StudentExamObjectives:認可和分數
  • ObjectiveGrades:FinalScore

但他們需要與另一個表進行交互。例如,StudentExamObjectives使用Score字段,其中是Answers表中所有問題的平均值,如果Score值大於或等於0.70,則認可爲1。

我不知道我的設計是否錯誤,或者我需要做一些技巧才能獲得這些值。

在此先感謝。

回答

1

您遇到的問題是由於缺乏標準化。無論何時您需要使用其他表的列值的函數時,都不應將其存儲在表中的列中 - 您應該根據需要計算它作爲需要此信息的查詢的一部分。您可以使用內聯表值函數(TVF)將單個或可能多個列返回一個表,從而簡化此操作。

否則,您必須在插入期間計算並存儲結果,從而導致數據冗餘,並且如果從中計算值的列出現更改或其行被刪除的列,則會導致數據不連貫。

有時候通過非規範化添加這樣的冗餘,但是這隻能在最壞的情況下完成,當用真實世界的場景分析數據庫時會迫使你朝這個方向發展。如果你走這條路線,一定要添加一些步驟,以確保在任何事務操作之後數據庫中的完整性。

0

StudentExamObjectives使用得分字段,其中對於所有 問題的答案正確表的平均,則認證爲1,如果分數值 高於或等於比0.70。

我不相信你可以用這種方式創建計算列。你可以使用CASE陳述的觀點嗎?東西(大致)是這樣的:

CASE WHEN Score >= 0.70 
    THEN 1 
    ELSE 0 
END AS IsAccredited 

Score值本身可以是聚合的所有考試的分數的平均值的結果。很難從你的模型中知道哪些字段當前存在,哪些字段只是概念上的。

相關問題