我必须设计一个简单的关系
我在考虑这种结构:
的时间间隔
-id
-workout_id(外键)
-seq_workout
锻炼
-id
-name
但是使用这种结构,如果在“锻炼”中多次出现“间隔”,我必须在表格中插入具有不同“seq_workout”的多个行间隔(间隔在锻炼中的位置) )。我发现使用可以保存的数据库空间不好。
我可以使用第三个表(interval_workout_position) 我在其中放置了Interval id,Workout id以及Workout中间隔的位置。这样我可以在锻炼中多次使用相同的间隔) 是否有另一种解决方案,因为我发现使用3表可能有点矫枉过正?
基本上我只是尝试重复呈现一个可重复的ArrayList(Workout有一个Interval的QList),对于那些熟悉其他语言的Qt或ArrayList的人来说。
谢谢!
答案 0 :(得分: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表是Workout和Interval之间的“关系”。 使用此模型
间隔可以显示为零,一个或多个锻炼,锻炼可以有零个,一个或多个间隔。
可以将特定于锻炼中特定间隔的任何属性添加到关系表中。只是间隔(如标签或其他)的属性,不会改变,那些将在Interval表上。
例如,如果您要跟踪锻炼结果,您将记录在workout_interval表上完成的代表的重量和数量。
更新2:
鉴于您希望Interval仅在单个Workout中使用,我可以使用我之前更新中的模型,但它不会让您受到约束......
该模型将提供该限制。 interval是exercise的子项,interval_seq是interval的子项。
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_
答案 1 :(得分:0)
只是说我选择了来自“spencer7593”的3个表的解决方案:
- 间隔
-workout
-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;