我想知道MySQL的以下表结构有什么想法。
我有练习和运动参数之间的关系,其中一个练习可以有多个参数。
例如,练习'仰卧起坐'可以具有参数'套'和& '代表'。
所有练习都以一组默认参数开头。例如:set,reps,weight,hold&其余部分。
此列表完全可自定义。用户可以为数据库中的每个练习添加参数,删除参数或重命名它们。
为表达这种关系,我有以下一对多结构:
TABLE exercises ID Name Table exerciseParameters ID exerciseID -> exercises(ID) Name
令我感到担忧的是,我注意到即使用户可以选择重命名/自定义参数,但很多时候他们都没有。所以我的exerciseParameters表填满了重复的单词,比如“Sets”& “Reps”相当多。
是否应该更好地组织这样的事情,以避免这么多的重复? (请记住,参数的名称必须是用户可自定义的。例如,“Reps”可能会被用户更改为“Hard Reps”。)(或者我从无到有做大事,这是确定没问题?)
提前感谢您的帮助。
答案 0 :(得分:3)
除非您处理数百万行,否则我会保留结构。它简单明了,易于查询。
如果您 处理数百万行并且您测量存储影响并认为它是不可接受的,那么您有几个选项(不一定是互斥的):
如果exerciseParameters
中没有参数,则假设它具有默认值。实际默认值可以存储在单独的表中,也可以存储在数据库外(取决于您的查询需求)。
exerciseParameters
。exerciseParameters
行。exerciseParameters
中删除。这利用了这样的假设,即除了编辑或删除的默认值之外,还会有更多的未更改。成本增加了复杂性(在修改和查询中)和潜在的性能。
因此名称(和值)只存储一次,使重复更便宜。例如:
ParameterNameID
和ParameterValueID
是整数,因此exerciseParameters
中的每次重复都比字符串便宜得多(存储方式)。 OTOH,你松散的简单性,可能会在查询性能方面付出代价(需要更多的JOIN)。
支持群集和前沿索引压缩的协议(例如,Oracle的ORGANIZATION INDEX COMPRESS表可以大大减少重复值对存储的影响)。
答案 1 :(得分:0)
您可以使用默认参数和值添加另一个表 defaultExerciseParams 。每当用户决定覆盖其中任何一个时 - 从该表中删除该参数并将其推入表格exerciseParameters