簡體   English   中英

數據庫問題,如何存儲變化的數據結構

[英]Database issue, how to store changing data structure

我正在構建一些應用程序,其中涉及培訓計划。 我的問題是這樣的

鍛煉可能很簡單,如下所示:

3 sets of 45 push ups.

所以我只創建2個字段,設置/計數

但是鍛煉也可以是:

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米游泳

數據不一致,一組可能是俯卧撐的數量,下一組可能是時間長度等。

您可以使用以下各列創建一個表:WorkoutType | 套裝 價值| 值類型 。 所以你可以像

----------------------------------
WorkoutType | Sets | Value | ValueType
----------------------------------

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

您可能需要考慮如下數據庫模式:

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在他的《企業應用程序體系結構模式》一書中將上述模型稱為 “具體表繼承”。 Bill Karwin還在其《 SQL Antipattens》一書的“實體-屬性-值”一章中描述了該模型。 他還描述了選擇EAV模型來解決這種情況的缺點。

另一方面,如果要總體架構具有靈活性,則可以考慮使用其他NoSQL解決方案而不是MySQL。 這些數據存儲區通常不需要固定的表架構。

我想說這需要一種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

training_components表:

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

好處:

  • 不限於特定活動

  • 易於查詢-與如何從這種數據結構中獲取數據有關的每個問題都已經在SO上得到了解答

  • 活動可以免費添加到每個鍛煉中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM