数据库问题,如何存储不断变化的数据结构

时间:2010-08-21 10:37:52

标签: php mysql

我正在构建一些应用程序,涉及培训计划。 我的问题是这样的,

锻炼可以很简单:

3 sets of 45 push ups.

所以我只想创建2个字段, 集/计数

BUT 锻炼也可以:

45 minutes run, 3 sets of 45 pushups, 2 minutes of rope jumping, 150 meter swimming.

所以我需要构建一个表,它会知道在更改结构时存储数据,之后我仍然可以将它转换为gui上的实际数据。

我怎样才能有效而明智地制作它?

修改

要说清楚一点, 我想为每个锻炼指定我在其中所做的事情。 所以一个锻炼可能是: 3套, 第一:45次俯卧撑 第二名:32次俯卧撑 第三名:30次俯卧撑

另一种锻炼可能是: 3组俯卧撑: 第一:45次俯卧撑 第二名:32次俯卧撑 第三名:30次俯卧撑 并且 2分钟的跳绳 150米游泳

数据不一致,一组可能是多个俯卧撑,下一组可能是时间长度等。

3 个答案:

答案 0 :(得分:1)

您可以创建一个包含以下列的表: 锻炼类型|集|价值|值类型 。所以你可以像

一样存储
----------------------------------
WorkoutType | Sets | Value | ValueType
----------------------------------

Pushups      | 3    | 45   | nos
Run          | null | 45   | minutes
Rope Jumping | null | 2    | minutes 
Swimming     | null | 150  | meter 

答案 1 :(得分:1)

您可能需要考虑以下数据库架构:

CREATE TABLE workouts (
   workout_id  int,
   user_id     int,
   PRIMARY KEY (workout_id)
) ENGINE=INNODB;

CREATE TABLE sessions_pushups (
   started     datetime,
   workout_id  int,
   number      int,
   PRIMARY KEY (started, workout_id),
   FOREIGN KEY (workout_id) REFERENCES workouts (workout_id)
) ENGINE=INNODB;

CREATE TABLE sessions_rope_jumping (
   started          datetime,
   workout_id       int,
   duration_minutes int,
   PRIMARY KEY (started, workout_id),
   FOREIGN KEY (workout_id) REFERENCES workouts (workout_id)
) ENGINE=INNODB;

CREATE TABLE sessions_swimming (
   started    datetime,
   workout_id int,
   meters     int,
   PRIMARY KEY (started, workout_id),
   FOREIGN KEY (workout_id) REFERENCES workouts (workout_id)
) ENGINE=INNODB;

这允许您进行不遵循先前锻炼模式的复杂锻炼。你可以很容易地拥有这样的东西:

CREATE TABLE sessions_triathlon (
   started            datetime,
   workout_id         int,
   swimming_meters    int,
   cycling_meters     int,
   running_meters     int,
   duration_minutes   int,
   PRIMARY KEY (started, workout_id),
   FOREIGN KEY (workout_id) REFERENCES workouts (workout_id)
) ENGINE=INNODB;

Martin Fowler calls the above model“具体表继承”在他的Patterns of Enterprise Application Architecture书中。 Bill Karwin还在他的SQL Antipattens书中,在实体 - 属性 - 值章节中描述了这个模型。他还描述了选择EAV模型来解决这种情况的不足之处。

另一方面,如果您想要总体架构灵活性,可以考虑使用其他NoSQL解决方案而不是MySQL。这些数据存储通常不需要固定的表模式。

答案 2 :(得分:1)

我会说这需要1:n关系,其中有一个主“锻炼”表,以及一个统一的“组件”表,其中包含锻炼的所有活动。

你有主表workouts

id   int
participant varchar(255)
date        datetime
...... any other workout related data

然后子表workout_components

workout_id  int          // Which workout this belongs to
tabindex    int          // Which sorting order this component has in the list
repeat      int          // Number of repetitions (e.g. 3 sets)
quantity    int          // e.g. 45 push-ups or 150 meters of cycling
quentity_unit varchar    // e.g. minutes or laps
activity    varchar      // push-ups, cycling .....

示例值如下所示:

锻炼表:

id          participant      date
1           Harry Miller     2010-08-21

workout_components表:

workout_id  tabindex     repeat      quantity     quantity_unit  activity
1           1            3           45           pcs            pushups
1           2            1           2            minutes        rope-jumping

优点:

  • 不限于特定活动

  • 易于查询 - 有关如何从这种数据结构中获取内容的每个问题都已在SO上得到解答

  • 活动可以自由添加到每个锻炼中