MySql中的规范化表结构......排序?

时间:2012-02-26 02:52:55

标签: php mysql normalization

我想知道MySQL的以下表结构有什么想法。

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

例如,练习'仰卧起坐'可以具有参数'套'和& '代表'。

所有练习都以一组默认参数开头。例如:set,reps,weight,hold&其余部分。

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

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

TABLE exercises
ID
Name

Table exerciseParameters
ID
exerciseID -> exercises(ID)
Name

令我感到担忧的是,我注意到即使用户可以选择重命名/自定义参数,但很多时候他们都没有。所以我的exerciseParameters表填满了重复的单词,比如“Sets”& “Reps”相当多。

是否应该更好地组织这样的事情,以避免这么多的重复? (请记住,参数的名称必须是用户可自定义的。例如,“Reps”可能会被用户更改为“Hard Reps”。)(或者我从无到有做大事,这是确定没问题?)

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

除非您处理数百万行,否则我会保留结构。它简单明了,易于查询。

如果您 处理数百万行并且您测量存储影响并认为它是不可接受的,那么您有几个选项(不一定是互斥的):

不存储默认值

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

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

这利用了这样的假设,即除了编辑或删除的默认值之外,还会有更多的未更改。成本增加了复杂性(在修改和查询中)和潜在的性能。

重新组织您的数据模型

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

enter image description here

ParameterNameIDParameterValueID整数,因此exerciseParameters中的每次重复都比字符串便宜得多(存储方式)。 OTOH,你松散的简单性,可能会在查询性能方面付出代价(需要更多的JOIN)。

使用其他DBMS

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

答案 1 :(得分:0)

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