php - MySql 中的规范化表结构...有点像?

标签 php mysql normalization

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

我在练习和练习参数之间存在关系,其中单个练习可以有多个参数。

例如,练习“仰卧起坐”可以具有参数“组数”和“次数”。

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

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

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

TABLE exercises
ID
Name

Table exerciseParameters
ID
exerciseID -> exercises(ID)
Name

令我担心的是,我注意到即使用户可以选择重命名/自定义参数,但很多时候他们没有。因此,我的锻炼参数表充满了重复的单词,例如“组数”和“重复次数”。

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

提前感谢您的帮助。

最佳答案

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

如果您正在处理数百万行,并且您已经测量了存储影响并认为它 Not Acceptable ,那么您有几个选择(不一定是相互排斥的):

不存储默认值

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

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

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

重新组织数据模型

因此名称(和值)仅存储一次,从而降低重复成本。例如:

enter image description here

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

使用不同的 DBMS

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

关于php - MySql 中的规范化表结构...有点像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9450114/

相关文章:

php - 如何从 PHP 中获取远程 JSON 或 XML API 数据并将返回对象分配为 PHP 变量?

javascript - TreeView 留言板 - 禁用对 child 不起作用的提交按钮

php - 如何在 PHP 中将变量作为 $_POST 键传递?

php - 如何从php访问ajax返回的数据?

mysql - 社交网站的数据库设计。帮助!

python - 如何在python中对图像进行反规范化?

javascript - 如何使用 Blade 在 Laravel 中显示选择框所选选项的详细信息?

php - MySQL数组到字符串转换错误

php - Arduino 没有正确地将数字发送到 SQL(通过 PHP)

machine-learning - 人工神经网络-为什么隐藏层通常使用 sigmoid 激活函数而不是 tanh-sigmoid 激活函数?