mysql - 数据库设计 - 一对一关系是否可以重复?

标签 mysql database arraylist relation

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

  • 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/

相关文章:

php - SQL 如何将多个表中的数据插入和选择到单个表中并使用不同的列?

database - 数据库和数据结构的区别?

mysql - 查询获取列总计并减去 MySQL

java - int binarySearch 数组列表

java - 如何使用空行跳出 while 循环?

PHP 重定向不适用于包含 SQL 查询的脚本

mysql - 带有依赖子查询的慢 MySQL 查询(检查客户端是否是第一种情况)

mysql - 在同一台机器上安装多个 MySQL 集群 - CentOS 7

ruby-on-rails - 我应该在 Rails 中创建用于存储用户地址的新表吗

java - 如何在java中的arraylist中添加异常