该数据库表应该规范化吗?

leo*_*ora 4 sql database-design database-schema database-normalization

我已经接管了一个存储健身信息的数据库,我们正在讨论某个表格,以及它是应该保留为一个表还是分成三个表.

今天,有一个名为:锻炼的表,其中包含以下字段

id,exercise_id,reps,weight,date,person_id

因此,如果我在一天内完成了2组3个不同的练习,那天我将在该表中有6个记录.例如:

ID,exercise_id,代表,重量,日期,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

所以问题是,鉴于多个记录中存在一些冗余数据(date,personid,exercise_id),是否应将其标准化为三个表

WorkoutSummary:
- id
- date
- person_id

WorkoutExercise:
- id
- workout_id(外键进入WorkoutSummary)
- exercise_id

WorkoutSets:
- id
- workout_exercise_id(外键进入WorkoutExercise)
- 代表
- 重量

我猜测的缺点是在重构之后查询会更慢,因为现在我们需要连接3个表来执行之前没有连接的相同查询.重构的好处允许将来在锻炼总结级别或锻炼级别添加新字段而不添加更多重复.

关于这场辩论的任何反馈?

Aar*_*ght 8

不要假设在规范化后查询会变慢.如果表格被正确索引,则加入少量表格非常便宜.

另一方面,非规范化表上的查询很容易变慢.例如,在原始模式中,只是尝试查询完成锻炼的不同日期比使用标准化版本要昂贵得多.

此时肯定会将其标准化.如果稍后遇到性能问题,那么除了已经规范化的模式之外,您还可以开始选择性地对数据的某些部分进行非规范化.但很可能你永远不会用一个小型数据库达到这一点.

  • @oo:你几乎应该总是索引外键字段(`WorkoutExercise`中的`workout_id`和`WorkoutSets`中的`workout_exercise_id`).根据数据库引擎的不同,您可能希望将部分或全部索引覆盖.我不确定那个`exercise_id`字段是什么,大概是正在进行的练习类型?如果是这样,如果你计划根据锻炼类型进行查询("约翰一直在跟蹲?")那么你可能也想要一个索引. (2认同)