我应该使用什么?一个字符串还是15个整数字段?


9

我正在开发一个学生跟踪程序,其中需要存储15个考试成绩。

我可以将标记存储为字符串,并在需要时将其拆分,以用于执行算术运算之类的目的。但是,我需要尽可能多的性能。

哪个更好?一个字符串字段,还是15个单独的int字段?


“ 15个考试分数”-像是一次考试的多项选择还是15个测试的分数?
rfusca 2012年

15个测试的分数
麦克

1
如果没有有关数据库类型的更多信息(具有索引的传统关系?)以及对数据访问和使用模式的要求,那么很难说出您应该使用哪种设计以及它将如何执行。
卡德·鲁

Answers:


27

如果您已经在谈论拆分和计算,请不要将其存储为数组。

无论关系理论,传统规范化规则和教条如何,它都只是一种设计,可为您提供最小的灵活性。

使每个检查结果连续。

我并没有试图预料到所有事情,但是有很多事情需要更细化(并且是的,归一化),而且只有稍微多一点的空间昂贵的设计才能为您提供现在或可能不需要的信息。将来可能不需要:

  • 抛出最高和最低结果?您将必须切分数组并对其进行排序。

  • 平均吗?您将需要将其切碎并总计

  • 对所有学生的考试结果进行分析?您将需要切片和旋转

  • 排序以进行计数(例如英国的GCSE,可能是7 As和2B)?您必须进行切片和排序

请注意,所有这些切片和排序都非常便宜,属于经过索引的标准化设计。


4
就是我要说的,但您说的更好!在一个字符串中存储多个值是任何数据库最糟糕的设计选择之一。
HLGEM 2012年

+1我的进一步解释。我倾向于简洁了。
rfusca 2012年

12

对于分数,从性能角度来看,明确的赢家正在将其数字存储起来,例如:

create table test_scores
(
  student_id int,
  test_id int,
  score int
);

它易于查询,易于更新和添加,并且超级容易且快速地执行聚合。考虑到“将这些信息存储为我必须拆分的字符串”或“存储在列中”的选择,对于RDBMS中的大多数用例,获胜者几乎总是会“存储在列中”。


如果始终是15组考试的同一组,则很可能存储非规范化(15列)的考试处理起来会更快。一个问题,您是否有意提出整数数据类型?
爱德华·多特兰

此外,每1名学生进行15次考试,您现在就可以存储15次学生ID和一个考试ID。
爱德华·多特兰


6
@EdwardDortland始终为15,直到不是。
从这里开始

1
@EdwardDortland:计算很好。现在,您可以为可能需要的索引做它们吗?
ypercubeᵀᴹ

1

只要您使用char(15)或15 tinyint使用tiny int(0到255)是相同的(大小明智)即可。因此,从性能角度来看,选择15个tinyints,因为您节省了提取和字符串处理的时间。

更新

如果标记是两位数,则需要CHAR(30),其大小是tinyint的15倍。


9
鉴于这种极其简单的设计,如果这个星球上有一家机构能够让足够多的学生参加15场考试(有满分),从而导致现代RDBMS的性能出现问题,我会哭泣今晚入睡。
菲尔(Philᵀᴹ)2012年

1
如果标记是两位数?但是mini int会根据您喜欢的计数方式,将分数从0扩展到255,或者将-127扩展到127。因此,由于分数很少会变为负数,因此一项考试的得分为250+,大多数考试的得分为0-100%。我认为tinyint在这里绝对有用。
jcolebrand

是的,我们同意,我只是简单地指出,将两位数字标记与一位数字标记相对应,将它存储为char会变得更加糟糕。从那时起,您将需要char(30)而不是char(15)。无论是否为两位数,15个小整数都将始终仅为15个字节。
爱德华·多特兰

-1,因为此答案建议的行设计远不如其他职位所建议的那样将每项考试结果存储在其行中的
字段
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.