我有一个mysql表,用于对单个学生的分数进行评分:
studentID int(11)
studentname varchar(70)
maths_score int(11)
science_score int(11)
english_score int(11)与维护数据库的原子性规则相比,此表的效率较低。是否可以将数学-科学-英语的分数存储在一列中,并且可以单独检索?如果不可能,我如何遵守原子性规则?
发布于 2011-11-14 20:17:18
是的,这是可能的。但是你的表甚至不会是第一范式。
为了符合此cas中的原子性规则,您需要将您的表分隔开三个不同的表。一个用于存储学生数据,另一个用于存储课程(英语、科学),另一个用于存储每个学生/课程组合的测试分数。
发布于 2011-11-14 20:18:12
您应该始终将这些数据归一化到单独的列中()。将选择的不同数据放入一个组合列中违反了第一范式,这是关系数据库模型的标准(如果不是要求的话)。
但是,您可以将数据复制到其他列中,以便更有效地执行某些查询。复制比去正规化危害小。例如,您可以存储一个total_score列,它可以节省您重新计算某种形式的加权平均值,但是将分数压缩到一列中并不是一个好主意。
如果您正在寻找一种存储任意数量的分数的方法,请为“主题”和“分数”创建一个表,并将它们链接起来,这样每个学生都可以有多个分数,每个分数都与一个主题相关。
发布于 2011-11-14 20:17:42
切勿将列编码为数据库中的一列,否则将失去轻松搜索的能力。如果您担心占用的空间,可以使用tinyint。
https://stackoverflow.com/questions/8121401
复制相似问题