2014-02-07 43 views
0

我要設計一個簡單的關係數據庫設計 - 與重複可能的一對一關係?

  • 1「鍛鍊」具有多個「間隔」
  • 1「間隔」是存在於只有1「鍛鍊」,但它可以重複多個時間處於「鍛鍊」

我在想這樣構成:
間隔
-id
-workout_id(外鍵)
-seq_workout

鍛鍊
-id
-name

但這種結構,如果一個 「間隔」 是在 「鍛鍊」 目前很多時間,我一定要插入多個這個間隔在表格中有一個不同的「seq_workout」(間隔在鍛鍊中的位置)。我發現這對使用可以保存的數據庫空間不利。

我可以使用第三個表格(interval_workout_position) 我在哪裏放置了Interval id,鍛鍊ID以及鍛鍊中間隔的位置。這樣我可以把相同的時間間隔多次在鍛鍊) 有沒有另一種解決方案,因爲我覺得使用3表可能是矯枉過正呢?

基本上我只是試圖reprensent一個ArrayList重複可能(鍛鍊有一個間隔的QList),對於那些熟悉Qt或其他語言的ArrayList。

謝謝!

+0

忘記列表或其他集合,甚至存在。他們違反了第一種正常形式。他們根本不適合關係模型。 – delnan

+0

你可以在你的鍛鍊表中添加repetition_count和interval_between_repetitions列並排列間隔表嗎? – Nihat

+0

我現在可以做任何事情,這是一個正在開發中的項目。我只是試圖複製一個適合我的對象結構的數據庫模型。恐怕我不能拋出Interval表,還有更多的數據我沒有發佈在「Interval」對象中。這裏是mySql腳本 – Astro

回答

0

這是一個一對多的關係。

您的關係設計是健全的。您所支持的表格設計支持這些要求;

正好發生1次鍛鍊的時間間隔。

1鍛鍊有零,一個或多個間隔。

一個間隔在鍛鍊中有一個位置(順序)。

除非您引入另一個實體,否則不需要第三個表。


更新:

中的問題顯示的表定義是不是在評論中添加表的設計不同。

如果你想建立一個多對多的關係,你可以使用三個表。

interval 
    id 
    message_en 
    duration 
    etc. 

workout 
    id 
    name 

workout_interval 
    id 
    workout_id (fk references workout.id) 
    seq_workout 
    interval_id (fk references interval.id) 
    etc. 

該模型是多對多的。

workout_interval表是鍛鍊和間隔之間的「關係」。 使用此模型

一個間隔可以出現在零,一個或多個鍛鍊中,並且鍛鍊可以有零個,一個或多個間隔。

任何特定於鍛鍊內特定間隔的屬性都可以添加到關係表中。只是Interval的屬性(如標籤或其他),不會改變,那些屬性會在Interval表中。

例如,如果您要跟蹤鍛鍊結果,則應記錄在workout_interval表上完成的鍛鍊的重量和數量。


更新2:假設你想在一個單一的鍛鍊只能使用一個間隔,我在我以前的更新的模型可以用來

,但它不會讓你的約束...

該模型將提供該限制。間隔是鍛鍊的孩子,而interval_seq是間隔的孩子。

workout 
    id 
    name 

interval 
    id 
    workout_id (fk references workout.id) 
    message_en 
    etc. 

interval_seq 
    id 
    interval_id (fk references interval.id) 
    seq_   (position within workout sequence 1,2,3,...) 
    etc. 

爲了得到鍛鍊中間隔序列,重複:

SELECT w.id 
    , s.seq_ 
    , i.* 
    , s.* 
    FROM workout w 
    JOIN interval i 
    ON i.workout_id = w.id 
    JOIN interval_seq s 
    ON s.interval_id = i.id 
WHERE w.id 
ORDER BY w.id, s.seq_ 
+0

我同意你所說的,「間隔恰好出現在1次鍛鍊中,間隔在鍛鍊中有一個位置(序列)「 - 間隔可能在同一窩中出現多次rkout(重複),並有多個位置。我想我可以將它們表示爲兩個不同的時間間隔,即使它們是彼此的副本。這就是爲什麼我想用另一種方式來表示它,所以我可以在我的間隔表中保存一些行。也許引入一個新的實體「重複」,並把我的間隔,而不是,我會想起它! – Astro

+0

我在一個小時前更新了我的答案。我想你真的有多對多的關係。兩個實體(鍛鍊和間隔)以及它們之間的關係。間隔A發生在鍛鍊中的位置1,2,5,6,間隔B發生在位置3,4等處 – spencer7593

+0

哦感謝編輯,我想這是一對多(一對一)的關係,不確定這是存在!因爲我希望在一次鍛鍊中有一次或多次鍛鍊身體,但我不希望在另一次鍛鍊中接受相同的時間間隔,也許我可以添加一個約束,即只能鍛鍊1次鍛鍊:) – Astro

0

只是說,我選擇的解決方案從 「spencer7593」 3個表:
-interval
- 鍛鍊
-interval_workout(區間和鍛鍊之間的聯繫)

這是最自然的對我來說,我缺少一個小約束(1個間隔只能在一次鍛鍊中),但我將管理表中的插入,所以我不必擔心這一點。

現在這裏是我爲數據庫中的特定用戶獲取所有區間鍛鍊的查詢的示例,此查詢從我的Rest webService返回一個xml文件,我的應用程序使用它來構建特定於用戶的鍛鍊: 現在我需要看看Json在我的應用程序中是否比Xml更好(現在使用Qt中的QXmlStreamReader),並且如果有更好的方法來編寫該查詢(當前在PHP頁面中硬編碼,難以維護)感謝您的幫助!
└(°ᴥ°)┘ - 到月球! - └(°ᴥ°)┘

/* GET ALL INTERVAL WITH DETAILS IN SUBSCRIBED WORKOUT FOR USER=X */ 
SELECT 
    /* plan */ 
    p.id plan_id, p.name_en plan_name_en, p.name_en plan_name_fr, 
    /* workout type */ 
    wt.id workout_type_id, wt.type_en workout_type_en, wt.type_fr workout_type_fr, 
    /* workout */ 
    w.id workout_id, w.name_en workout_name_en, w.name_fr workout_name_fr, 
    w.descrip_en workout_descrip_en, w.descrip_fr workout_descrip_fr, w.creator workout_creator, 
    /* seq_workout */ 
    iw.seq_workout, 
    /* intervalle */ 
    i.id intervalle_id, i.duration intervalle_duration, i.msg_en intervalle_msg_en, i.msg_fr intervalle_msg_fr, 
    /* intervalle : power */ 
    i.power_start intervalle_power_start, i.power_end intervalle_power_end, i.power_range intervalle_power_range, i.power_left intervalle_power_left, 
    /* intervalle : cadence */ 
    i.cadence_start intervalle_cadence_start, i.cadence_end intervalle_cadence_end, i.cadence_range intervalle_cadence_range, 
    /* intervalle : hr */ 
    i.hr_start intervalle_hr_start, i.hr_end intervalle_hr_end, i.hr_range intervalle_hr_range, 
    /* intervalle type */ 
    it.id intervalle_type_id, it.type_en intervalle_type_en, it.type_fr intervalle_type_fr, 
    /* intervalle : step type */ 
    isPower.id intervalle_steptype_power_id, isPower.type_en intervalle_steptype_power_type_en, isPower.type_fr intervalle_steptype_power_type_fr, 
    isCadence.id intervalle_steptype_cadence_id, isCadence.type_en intervalle_steptype_cadence_type_en, isCadence.type_fr intervalle_steptype_cadence_type_fr, 
    isHr.id intervalle_steptype_hr_id, isHr.type_en intervalle_steptype_hr_type_en, isHr.type_fr intervalle_steptype_hr_type_fr 
FROM user u 
INNER JOIN user_groupe ug 
ON u.id = ug.user_id 
INNER JOIN groupe g 
ON ug.groupe_id = g.id 
INNER JOIN groupe_plan gp 
ON g.id = gp.groupe_id 
INNER JOIN plan p 
ON gp.plan_id = p.id 
INNER JOIN workout w 
ON p.id = w.plan_id 
INNER JOIN workout_type wt 
ON wt.id = w.workout_type_id 
INNER JOIN intervalle_workout iw 
ON w.id = iw.workout_id 
INNER JOIN intervalle i 
on i.id = iw.intervalle_id 
INNER JOIN intervalle_type it 
on i.intervalle_type_id = it.id 
INNER JOIN intervalle_steptype isPower 
on isPower.id = i.power_steptype_id 
INNER JOIN intervalle_steptype isCadence 
on isCadence.id = i.cadence_steptype_id 
INNER JOIN intervalle_steptype isHr 
on isHr.id = i.hr_steptype_id 
WHERE u.id = 1 
ORDER BY iw.workout_id, iw.seq_workout;