首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库问题,如何存储更改的数据结构

数据库问题,如何存储更改的数据结构
EN

Stack Overflow用户
提问于 2010-08-21 10:37:51
回答 3查看 281关注 0票数 0

我正在建立一些应用程序,其中包括培训项目。我的问题是这样,

锻炼可能很简单,如下所示:

代码语言:javascript
复制
3 sets of 45 push ups.

所以我只创建两个字段,集合/计数

但锻炼也可以是:

代码语言:javascript
复制
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米游泳。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-21 11:04:37

我认为这需要一个1:n的关系,其中有一个主“锻炼”表和一个包含锻炼活动的统一的“组件”表。

你会有你的主桌workouts

代码语言:javascript
复制
id   int
participant varchar(255)
date        datetime
...... any other workout related data

然后是子表workout_components

代码语言:javascript
复制
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 .....

一个示例值如下所示:

健身桌:

代码语言:javascript
复制
id          participant      date
1           Harry Miller     2010-08-21

workout_components表:

代码语言:javascript
复制
workout_id  tabindex     repeat      quantity     quantity_unit  activity
1           1            3           45           pcs            pushups
1           2            1           2            minutes        rope-jumping

优势:

  • 不限于具体活动
  • 易于查询--关于如何从这种数据结构中获取某些内容的每一个问题都已经得到了回答。
  • 活动可以免费添加到每次锻炼中。
票数 1
EN

Stack Overflow用户

发布于 2010-08-21 10:47:11

您可以创建一个包含以下列的表: WorkoutType、、Value、ValueType。这样你就可以像

代码语言:javascript
复制
----------------------------------
WorkoutType | Sets | Value | ValueType
----------------------------------

Pushups      | 3    | 45   | nos
Run          | null | 45   | minutes
Rope Jumping | null | 2    | minutes 
Swimming     | null | 150  | meter 
票数 1
EN

Stack Overflow用户

发布于 2010-08-21 10:53:45

您可能需要考虑数据库架构,如以下所示:

代码语言:javascript
复制
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;

这使您可以进行不遵循以前锻炼模式的复杂锻炼。你可以很容易地得到这样的东西:

代码语言:javascript
复制
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称上述模型为“具体表继承”在他的企业应用体系结构模式书中。比尔·卡温还在他的SQL Antipattens书“实体-属性-值”一章中描述了这个模型。他还描述了选择EAV模型来解决这种情况的缺点。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3537288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档