[英]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.