我必须设计一个简单的关系
- 1 个“锻炼”有多个“间隔”
- 1 个“间隔”仅出现在 1 个“锻炼”中,但可以在一个“锻炼”中重复多次
我正在考虑采用这种结构:
间隔
-id
-workout_id(外键)
-seq_workout
锻炼
-id
-名称
但是使用这种结构,如果“锻炼”中多次出现“间隔”,我必须在表中插入此间隔的多行,并使用不同的“seq_workout”(间隔在锻炼中的位置) )。我发现这不利于使用本来可以节省的数据库空间。
我可以使用第三个表(interval_workout_position) 我在其中放置了间隔 ID、锻炼 ID 以及间隔在锻炼中的位置。这样我就可以在锻炼中多次使用相同的间隔) 是否还有其他解决方案,因为我发现使用 3 个表对此可能有点过分?
基本上,我只是想为那些熟悉其他语言中的 Qt 或 ArrayList 的人尝试表示可能重复的 ArrayList(Workout 有一个 Interval 的 QList )。
谢谢!
最佳答案
这是一对多关系。
您的关系设计是合理的。您的表格设计支持这些要求;
间隔恰好在 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.
这个模型是多对多的。
锻炼间隔表是锻炼和间隔之间的“关系”。 有了这个模型
一个间隔可以出现在零个、一个或多个锻炼中,并且一个锻炼可以有零个、一个或多个间隔。
特定于锻炼中特定间隔的任何属性都可以添加到关系表中。仅间隔的属性(如标签或其他)不会更改,这些属性将位于间隔表中。
例如,如果您要跟踪锻炼结果,您可以在锻炼间隔表中记录完成的体重和次数。
<小时/>更新2:
鉴于您希望仅在一次锻炼中使用间隔,可以使用我之前更新中的模型,但它不会给您带来约束......
该模型将提供该限制。 Interval 是 Training 的子级,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_
关于mysql - 数据库设计 - 一对一关系是否可以重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21638878/