我已经接管了一个存储健身信息的数据库,而我们正在讨论某个桌子以及该桌子应该保留为一张表还是分成三张表。
今天,有一张表叫做: workouts ,具有以下字段
id, exercise_id, reps, weight, date, person_id
因此,如果我一天进行2组3个不同的练习,那一天我在该表中将有6条记录。例如:
id, exercise_id, reps, weight, date, person_id 1, 1, 10, 100, 1/1/2010, 10 2, 1, 10, 100, 1/1/2010, 10 3, 1, 10, 100, 1/1/2010, 10 4, 2, 10, 100, 1/1/2010, 10 5, 2, 10, 100, 1/1/2010, 10 6, 2, 10, 100, 1/1/2010, 10
所以问题是,鉴于在多个记录中有一些冗余数据(日期,人员ID,exercise_id),是否应将其标准化为三个表
WorkoutSummary : - id - date - person_id
WorkoutExercise : - ID - workout_id(foreign key into WorkoutSummary) - exercise_id
WorkoutSets : - workout_exercise_id (foreign key into WorkoutExercise) - reps - weight
我猜想它的缺点是,在此重构之后查询会变慢,因为现在我们需要联接3个表来执行以前没有联接的相同查询。重构的好处是,将来可以在锻炼摘要级别或锻炼级别添加新字段,而无需添加更多重复项。
对此辩论有任何反馈吗?
不要以为标准化后查询会变慢。如果对表进行正确索引,则对少量表的联接将非常便宜。
另一方面,对非规范化表的查询很容易导致速度变慢。例如,在您的原始架构中,仅尝试查询完成锻炼的不同日期比使用标准化版本要昂贵得多。
在这一点上一定要对其进行归一化。如果以后遇到性能问题,那么 除了 已经规范化的架构 之外 ,您还可以开始选择性地对数据的某些部分进行规范化。但是,使用小型数据库绝不可能达到这一点。