数据库设计 - 重复可能的一对一关系?

时间:2014-02-07 22:22:53

标签: mysql database arraylist relation

我必须设计一个简单的关系

  • 1“锻炼”有多个“间隔”
  • 1“间隔”仅存在于1个“锻炼”中,但可以在“锻炼”中重复多次

我在考虑这种结构:
时间间隔
-id
-workout_id(外键)
-seq_workout

锻炼
-id
-name

但是使用这种结构,如果在“锻炼”中多次出现“间隔”,我必须在表格中插入具有不同“seq_workout”的多个行间隔(间隔在锻炼中的位置) )。我发现使用可以保存的数据库空间不好。

我可以使用第三个表(interval_workout_position) 我在其中放置了Interval id,Workout id以及Workout中间隔的位置。这样我可以在锻炼中多次使用相同的间隔) 是否有另一种解决方案,因为我发现使用3表可能有点矫枉过正?

基本上我只是尝试重复呈现一个可重复的ArrayList(Workout有一个Interval的QList),对于那些熟悉其他语言的Qt或ArrayList的人来说。

谢谢!

2 个答案:

答案 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;