【问题标题】:How to make this many-to-many relationship work?如何使这种多对多关系发挥作用?
【发布时间】:2019-03-18 01:32:13
【问题描述】:

我有一张练习表。我希望能够在我的反应应用程序中创建锻炼,然后将其提交到数据库。但我正在努力思考架构将如何工作。我怎样才能做到这一点?

我本质上希望锻炼是一系列锻炼。但我知道在数据库中存储数组并不是最好的主意

但我不明白,如果我有一个练习表,然后是一个锻炼表,我如何将它们组合在一起形成一个表格,其中包含锻炼的锻炼列表

我希望能够进行一项独特的锻炼,这将为我提供该锻炼的锻炼列表以及日期和其他信息。

我能想象出来的唯一方式是:

id: 1, name: 'my first workout', exercises: [array of objects]

您知道这个架构的外观吗?

【问题讨论】:

  • 编辑标题以针对您的特定问题。
  • 是时候阅读一本已出版的关于信息建模和数据库设计的学术教科书了。 (用于记录和使用设计的语言和工具的手册不是关于进行信息建模和数据库设计的教科书。) PS 这是(显然)一个(很容易用谷歌搜索)常见问题解答。在考虑发布之前,请始终在谷歌上搜索您的问题/问题/目标和/或错误消息的许多清晰、简洁和准确的措辞,包括和不包括您的特定字符串/名称,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。 PS 请用 DBMS 或某种 DBMS 标记。

标签: javascript database join database-design


【解决方案1】:

对于多对多关系,您应该有第三个表来存储关系,称为联结表。例如,在您的情况下,每一行都有一个exerciseID 和一个workoutID,这意味着两个(锻炼和锻炼)是相关的。

因此,例如,该表中可以有很多行带有exerciseID = 1(不同的workoutIDs)和很多行带有workoutID = 5(不同的exerciseIDs),因此是多对多的。

更多解释


联结表的每一行都有三个字段:

  • 它自己的 id(因为在数据库中每个表都有一个 id 是一种很好的做法,无论如何)
  • 练习 ID
  • 锻炼ID

例如,假设我们有一个这样的联结表:

ID      ExerciseID    WorkoutID
-------------------------------
1000    12            5
1001    12            6
1002    12            9
1003    12            12
1004    12            27
1005    13            2
1006    13            6
1007    13            9

这意味着:

  • 锻炼号码12有锻炼[5, 6, 9, 12, 27]
  • 练习号13有练习[2, 6, 9]

但至于这个表应该如何创建:

您可以拥有一个允许用户添加、编辑和删除练习和锻炼的用户界面,或者您可以自己操作。无论哪种方式,任何定义锻炼或锻炼的人都必须知道它们之间的关系!所以他们也可以将该关系定义为联结表中的一行

【讨论】:

  • 好的,我明白了,但我不明白第三个表如何知道哪个锻炼 ID 与哪个锻炼 ID 匹配?如果这有意义
  • 联结表的每一行都有三个字段:它自己的id(因为在数据库中每个表都有一个id,无论如何都是很好的做法),exerciseIDworkoutID。因此,例如,一行将是 [1000, 12, 5] 这意味着锻炼编号 12 与锻炼编号 5 相关
  • 但我的意思是这个。说我有id: 1, name: bicep curls。在练习表中。我怎么知道它是否有锻炼 id:1、id:5 或两者都有或两者都没有?例如
  • 对不起,我真的很密集。我知道这就是它的样子,但我还是不知道你是怎么到那张桌子的?说练习有5行,唯一的ID。锻炼表有 5 行,唯一的 ID。我仍然不确定数据集在什么时候可以知道。没有任何东西可以连接两张桌子(我知道中间的桌子,但我看不到你是如何到达那张桌子的,或者你做了什么来生成它..)对不起,我可能很厚
  • 当然数据本身无法知道!但是你知道,并且你填充了表格。常见的场景是,当您定义每个练习并将其添加到数据库时,您还定义了它的关系(意味着您将记录添加到联结表)。
猜你喜欢
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
相关资源
最近更新 更多