【问题标题】:Normalized table structure in MySql... Sort of?MySql中的规范化表结构......排序?
【发布时间】:2012-03-16 01:06:29
【问题描述】:

我想知道对于 MySQL 的以下表结构有何想法。

我有练习和练习参数之间的关系,其中一个练习可以有多个参数。

例如,练习“仰卧起坐”可以有参数“sets”和“reps”。

所有练习都从一组默认参数开始。例如:组数、次数、重量、保持和休息。

此列表是完全可定制的。用户可以为数据库中的每个练习添加参数、删除参数或重命名它们。

为了表达这种关系,我有以下一对多的结构:

TABLE exercises
ID
Name

Table exerciseParameters
ID
exerciseID -> exercises(ID)
Name

让我担心的是,我注意到即使用户可以选择重命名/自定义参数,但很多时候他们没有。所以我的 exerciseParameters 表中充满了重复的单词,比如“Sets”和“Reps”。

有没有更好的方式来组织这样的事情,以避免如此多的重复? (请记住,参数的名称必须是用户可自定义的。例如,“Reps”可能会被用户更改为“Hard Reps”。)(或者我是在无中生有,这是还可以吗?)

在此先感谢您的帮助。

【问题讨论】:

    标签: php mysql normalization


    【解决方案1】:

    您可以使用默认参数和值添加另一个表 defaultExerciseParams。每当用户决定覆盖其中任何一个时 - 从该表中删除参数并将其推送到 Table exerciseParameters

    【讨论】:

      【解决方案2】:

      除非您要处理数百万行,否则我会保持结构不变。查询简单易行。

      如果您正在处理数百万行并且您已衡量存储影响并认为它不可接受,那么您有几个选择(不一定相互排斥):

      不要存储默认值

      如果exerciseParameters 中不存在参数,只需假设它具有默认值。实际的默认值可以存储在单独的表中或完全存储在数据库之外(取决于您的查询需求)。

      • 如果用户更改默认参数,请将其存储在exerciseParameters
      • 如果用户删除默认参数,将其表示为包含 NULL 值的 exerciseParameters 行。
      • 如果用户恢复默认参数为其原始值,请将其从exerciseParameters 中删除。

      这利用了一个假设,即与已编辑或删除的默认值相比,未更改的内容要多得多。代价是增加了复杂性(修改和查询)和潜在的性能。

      重新组织你的数据模型

      所以名称(和值)只存储一次,使得重复更便宜。例如:

      ParameterNameIDParameterValueID整数,因此exerciseParameters 中的每次重复都比字符串便宜得多(存储方面)。 OTOH,您失去了简单性,并可能为查询性能付出代价(需要更多的 JOIN)。

      使用不同的 DBMS

      支持集群领先的索引压缩(例如,Oracle 的 ORGANIZATION INDEX COMPRESS 表可以大大减少重复值的存储影响)。

      【讨论】:

      • 感谢您的周到回复。我将暂时保留原样,但这为我提供了许多可供考虑的路线。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 2013-08-21
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多