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