我想知道对以下 MySQL 表结构有何想法。
我在练习和练习参数之间存在关系,其中单个练习可以有多个参数。
例如,练习“仰卧起坐”可以具有参数“组数”和“次数”。
所有练习都以一组默认参数开始。例如:组数、次数、重量、保持和休息。
此列表是完全可定制的。用户可以为数据库中的每个练习添加参数、删除参数或重命名参数。
为了表达这种关系,我有以下一对多结构:
TABLE exercises ID Name Table exerciseParameters ID exerciseID -> exercises(ID) Name
令我担心的是,我注意到即使用户可以选择重命名/自定义参数,但很多时候他们没有。因此,我的锻炼参数表充满了重复的单词,例如“组数”和“重复次数”。
是否有更好的方式来组织这样的事情,以避免如此多的重复? (请记住,参数的名称必须是用户可自定义的。例如,“Reps”可能会被用户更改为“Hard Reps”。)(或者我是无中生有,这是就这样好吗?)
提前感谢您的帮助。
最佳答案
除非您要处理数百万行,否则我会保留结构不变。简单明了,易于查询。
如果您正在处理数百万行,并且您已经测量了存储影响并认为它 Not Acceptable ,那么您有几个选择(不一定是相互排斥的):
不存储默认值
如果exerciseParameters
中不存在参数,则简单地假设它具有默认值。实际的默认值可以存储在单独的表中或完全存储在数据库外部(取决于您的查询需求)。
- 如果用户更改默认参数,请将其存储在
exerciseParameters
中。 - 如果用户删除默认参数,请将其表示为包含 NULL 值的
exerciseParameters
行。 - 如果用户恢复默认参数为其原始值,请将其从
exerciseParameters
中删除。
这利用了这样一个假设:未修改的默认值比已编辑或已删除的默认值要多。代价是复杂性(修改和查询)和潜在性能的增加。
重新组织数据模型
因此名称(和值)仅存储一次,从而降低重复成本。例如:
ParameterNameID
和 ParameterValueID
是整数,因此 exerciseParameters
中的每次重复要便宜得多(存储方面)比如果它们是字符串。 OTOH,您失去了简单性,并且可能会在查询性能方面付出代价(需要更多的 JOIN)。
使用不同的 DBMS
支持集群和领先的索引压缩(例如,Oracle 的 ORGANIZATION INDEX COMPRESS 表可以大大减少重复值的存储影响)。
关于php - MySql 中的规范化表结构...有点像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9450114/