【问题标题】:storing multiple data in one mysql column and retrieval of data individually在一个mysql列中存储多个数据并分别检索数据
【发布时间】:2011-11-14 20:19:21
【问题描述】:

我有一个 mysql 表用于对单个学生的分数进行评分:

studentID int(11)
studentname varchar(70)
maths_score int(11)
science_score int(11)
english_score int(11)

与维护数据库的原子性规则相比,此表效率低下。是否可以将数学-科学-英语的分数存储在一列中,并且可以单独检索?如果不可能,如何符合原子性规则?

【问题讨论】:

  • 您能解释一下为什么要将它们全部放在同一列中吗?
  • 避免多出两列
  • 不要试图超越模型。列是这种数据存储的最有效机制。将它们与某种varchar blob monstrosity 结合起来几乎违反了书中的所有规范化规则,更不用说它在存储、比较和搜索方面效率低下。
  • 如果您想减少存储空间,您可能需要考虑 SMALLINT(范围 -32768 到 32767)或 TINYINT(范围 -127 到 127),具体取决于您的评分.当然,除非您的学生在考试中得分 2147483647。

标签: mysql sql


【解决方案1】:

您应该始终将此类数据标准化为单独的列。将选择的不同数据放入一个组合列中违反了第一范式,这是关系数据库模型的标准(如果不是要求的话)。

但是,您可以将数据复制到额外的列中,以便更有效地执行某些查询。与非规范化相比,复制的危害要小一些。例如,您可以存储一个 total_score 列,这样可以节省您重新计算某种形式的加权平均值,但将分数合并为一列是个坏主意。

如果您正在寻找存储任意数量分数的方法,请为“科目”和“分数”创建一个表,并将它们链接起来,以便每个学生可以有多个分数,每个分数都相关一个主题。

【讨论】:

    【解决方案2】:

    是的,这是可能的。但是您的表格甚至不会处于第一范式。

    为了符合这个 cas 中的原子性规则,你需要将你的表分成三个不同的表。一个用于存储学生数据,另一个用于存储课程(英语、科学),另一个用于存储每个学生/课程组合的测试成绩。

    【讨论】:

      【解决方案3】:

      永远不要将数据库中的列编码为一个,否则您将失去轻松搜索的能力。如果您担心使用的空间,可以使用 tinyint。

      【讨论】:

      • 没错,尽管与基本违反第一范式相比,失去搜索能力是一个小问题。
      【解决方案4】:

      您不能在一列中存储多个属性,然后单独检索它们。 您必须将每个属性存储在单独的列中,以符合 1 NF。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-11
        • 2012-11-26
        • 1970-01-01
        • 2019-05-10
        • 2011-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多