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

mik*_*ike 9 performance database-design datatypes query-performance

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

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

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

Cad*_*oux 27

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

不管关系理论和传统的规范化规则和教条如何,它只是一个给你最小灵活性的设计。

将每个考试结果排成一行。

我不是想预测所有事情,但是有很多事情是更细粒度的(并且,是的,标准化)并且只是稍微多一点空间昂贵的设计促进了您现在可能需要或可能不需要的事情,可能或将来可能不需要:

  • 抛出最高和最低的结果?您将不得不对数组进行切片并对其进行排序。

  • 平均?你必须把它切碎并总计

  • 跨学生的考试分析考试结果?你必须切片和旋转

  • 排序计数(或例如英国 GCSE,它可能是 7 As 和 2B)?你必须切片和排序

请注意,所有这些切片和排序在索引、规范化的设计中都非常便宜。

  • 正是我要说的,但你说得更好!在一个字符串中存储多个值对于任何数据库来说都是最糟糕的设计选择之一。 (4认同)

rfu*_*sca 12

对于分数,在性能方面,明显的赢家将其以数字方式存储,如下所示;

create table test_scores
(
  student_id int,
  test_id int,
  score int
);
Run Code Online (Sandbox Code Playgroud)

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

  • @EdwardDortland 它永远是 15 直到它不是。 (6认同)

Edw*_*and 1

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

更新

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

  • 鉴于这个极其简单的设计,如果这个星球上有一个机构有足够多的学生参加 15 场考试(有分数),导致现代 RDBMS 出现性能问题,我今晚会哭着入睡。 (9认同)