使用其他表中的数据创建计算字段

时间:2011-11-02 19:32:11

标签: sql-server database sql-server-2008 database-design

我正在为主题学校创建数据库设计。我目前的设计显示在下一个链接中:

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

我附上了三个实体,然后所有实体都包含计算字段:

  • StudetExams:平均
  • StudentExamObjectives:Accredited and Score
  • ObjectiveGrades:FinalScore

但他们需要与另一张桌子互动。例如,StudentExamObjectives使用Score字段,其中是Answers表中所有问题的平均值,如果Score值高于或等于0.70,则认可为1。

我不知道我的设计是否错误,或者我需要做一些技巧来获取这些值。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您遇到的问题是由于缺乏规范化。每当您需要其他表的列值的函数时,您不应将其存储在表的列中 - 您应该根据需要计算它作为需要此信息的查询的一部分。您可以使用内联表值函数(TVF)来简化此操作,该函数返回具有单个或可能多个列的表。

否则,您必须在插入期间计算和存储结果,从而导致数据冗余,并且如果计算值的任何列发生更改或其行被删除,则可能会出现数据不一致的视图。

有时候通过非规范化添加这种冗余,但这只应该在最坏的情况下进行,当用真实场景分析数据库时会迫使你朝这个方向发展。如果你走这条路线,一定要添加一些步骤,以确保在任何交易操作后数据库中存在完整性。

答案 1 :(得分:0)

  

StudentExamObjectives使用Score字段,其中是所有的平均值   问题在Answers表中更正,如果得分,则认可为1   值大于或等于0.70。

我不相信你可以用这种方式创建计算列。您可以使用带有CASE语句的视图吗?某事(大致)是这样的:

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

Score的值本身可能是汇总所有考试成绩的平均值的结果。从你的模型中很难说出目前存在哪些领域,哪些领域只是概念性的。