我一直试图围绕这个数据库应该如何建模。我使用Ruby on Rails来做一个健身追踪网站。我想要的是用户能够维护一个练习列表,然后他们可以使用它们来构建和维护他们的例程列表。然后,当他们真正完成那个例程时,它会创建一个Workout,它会记录他们执行常规时的信息。
因此,练习和例程更像是用户可以使用的模板,因此他们不必每次都重新输入所有信息。我感到困惑的地方在于如何将这一切融合在一起。一个例程可以有不同数量的练习,所以我知道我需要另一个表来保持它们之间的关联。我的问题是我怎样才能在每次锻炼表中记录信息?我希望这个问题很明确,下面是我目前关于如何建模这个设置的想法。
运动
type:string(将限制为"力量"或"有氧运动")
代表:INT
重量:浮
集:INT
距离:浮动
TOTALTIME:时间
的常规
标题:字符串
的锻炼
日期时间:日期时间
???
我不确定如何记录实际的锻炼数据。我可以整天构建模板,但其余的都没有我。任何帮助表示赞赏。
答案 0 :(得分:0)
[免责声明:我不熟悉Ruby on Rails,所以这个答案完全来自数据库建模的角度。]
看起来您需要一个与此类似的数据库结构:
上图仅显示了建模表之间关系的关键字段。根据需要在这个“骨架”上添加“肉”。
ROUTINE和EXERCISE之间存在多对多的关系,所以几个例程可以包含相同的练习(反之亦然)。该模型目前允许在不同用户之间共享练习 - 让我知道这是不可取的。
ROUTINE_EXERCISE.EXERCISE_NO定义给定例程中的练习顺序。同时,ROUTINE_EXERCISE.EXERCISE_ID在主键中不,允许在同一例程中的多个“位置”重复相同的练习。
例程对用户来说当前是“私有的”。如果它们应该在用户之间共享,则需要在USER和ROUTINE之间建立一个额外的联结表,并且需要更改对谁可以锻炼下面描述的给定例程的限制。
ROUTINE使用识别关系(ROUTINE.USER_ID是FK和PK的一部分),因此当WORKOUT引用USER和ROUTINE时,它可以从两者中迁移USER_ID。这可以确保用户无法对属于不同用户的例程进行锻炼。
ROUTINE.ROUTINE_NAME是一个人类可读的例程名称,在给定用户级别上是唯一的,但不同的用户可以“重复使用”相同的名称。您可以使用整数ROUTINE_NO之类的东西来保持引用表更加细长。
WORKOUT的主键对于clustering非常有用 - 实际上,属于同一用户的所有训练将在物理上紧密地存储在数据库中。据推测,WORKOUT表是增长最快的表,所以将所有内容很好地“预先分组”(按用户)和“预先排序”(按日期/时间,对于给定用户)可以使性能受益。
WORKOUT.ROUTINE_NAME已启用NULL,因此当用户更改或删除例程时,可以将WORKOUT与其断开连接,而不会自行删除。另一种方法是永远不要修改或删除ROUTINE,而是使用某种形式的版本控制(用于修改)和DELETED标志(用于删除)。 these lines之类的东西,但更简单。