哪个数据库设计更好?

Which database design is better?

我要创建一个数据库来跟踪举重练习。

您更喜欢哪种方法?

方案一:

两个table

  • Exercise (with ID, Name etc.)
  • Set (with ID, Set_Number, Date, FK_Exercise)

这里,一个ExerciseSet是一对多的关系。 Set_Number 应该跟踪它在给定日期的哪个集(第 1 集、第 2 集、第 3 集等)

优点:少table处理

方案B:

三个table:

  • Exercise (with ID, Name etc.)
  • Session (with ID, Date, FK_Exercise)
  • Set (with ID, Set_Number, FK_Session)

在这里,Session 类似于 ExerciseSet 之间的连接器。因此,基本上,给定练习的给定日期的一系列集合将汇集在一个 Session 实例中。 在这种情况下,ExerciseSession 具有一对多关系,并且 SessionSet 也具有一对多关系。

优点:日期 属性 对于任何给定的一天都不会多余。从逻辑上讲,捆绑集合是有意义的。

良好的数据模型离不开对领域的正确理解。您的域具有三个实体:

  • 练习:特定类型的举重动作(名称重量
  • SET:给定锻炼的 次数 (取决于训练目标 - 力量、肌肉、耐力?)
  • SESSION:在给定的 日期
  • 进行的 SET 次数

所以你至少需要三个table。至少,因为 EXERCISE 有两个详细级别:一个是练习 name ,另一个是练习 weight 。您很可能需要存储名称和权重的不同组合(Bicep curl / 10kgBicep curl / 15kg 等)的 SET,在这种情况下您需要查找 table EXERCISE 名称和第四个table SET_EXERCISE 存储用于特定 SET 重复 的重量。

完成这个练习后(哦!)我们可以看到您的外键是错误的。一个 SESSION 包含多个 SET;一个 SET 包含许多 EXERCISE(SET_EXERCISEs)。

因此逻辑数据模型应该类似于:

  • 锻炼(ID、姓名、体重等)
  • 设置(ID、FK_Exercise、代表等)
  • 会话(ID、FK_Set、日期等)

虽然不是很准确:SET:SESSION实际上是多对多的关系,因为一个SESSION通常会包含多个SET,而一个SET可以在多个SESSION中完成。

当谈到物理数据模型时,即 tables 你应该有五个 tables:

  • 练习(ID、姓名等)
  • SET_EXERCISE(身份证,FK_Exercise,FK_Set,体重等)
  • SET(ID,FK_Set_Exercise,Reps 等)
  • SESSION_SET(FK_Set、FK_Session、Set_Number 等)
  • 会话(ID、日期等)

SESSION_SET table 是解决 SET 和 SESSION 之间的多对多关系所必需的。

最终模型有五个 table:三个 table 用于原始实体,两个交集 table 连接这些实体。碰巧逻辑实体(EXERCISE、SET、SESSION)之间的所有关系都被实现为交集 table 而不是外键。当从逻辑数据模型转换为物理数据模型时,这并不总是发生。


这不是对域建模的唯一方法。作为设计 activity 数据建模是关于 interpreting the rules 以适合您需要记录的数据。数据是起点。

"it seems I didn't make myself clear regarding the Session entity...he naming is probably bad and misleading"

这就是为什么我说数据模型来自对领域的正确理解。 EXERCISE、SET 和 SESSION 是领域术语。当然欢迎您为您的私人项目对事物做出自己的定义,但在现实生活中数据模型是开发和业务之间的一种沟通机制:事物的意义至关重要,并且必须符合共同的理解。我们无法构建一个数据模型,其中 SESSION 的含义与业务所理解的 "session" 不同。

"I also don't understand how a Set can be done in more than one Session?"

一组是 次数 的锻炼模式。所以 #1 / benchpress / 130KG / 8 reps 是一个 SET 而 #2 / benchpress / 100KG / 12 reps 是一个不同的 SET。如果你在星期一和星期三卧推 130KG 八次,那么在两个不同的 SESSION 中这是相同的 SET。也许这是一个太过分的细节层;但是如果你打算构建一个数据库应用程序来跟踪你的锻炼而不是像大多数人一样使用电子表格,你还不如构建最好的数据模型:-)

再次重申,数据建模是一项涉及大量意见的练习:如果您的数据模型足以满足您当前的需求,那么它就足够好了。问题是,更严格的数据模型反而更灵活(因为强制执行数据完整性规则可以更轻松地编写查询并确保结果正确)。现在可能足够好的东西可能会成为未来创新的可怕刹车。