Ruby on Rails:加入表概念

时间:2016-10-26 00:34:56

标签: ruby-on-rails

所以我已经离开了编码游戏一段时间,最近决定拿起铁轨。我对rails中的Join表的概念有疑问。具体做法是:

1)为什么数据库中需要这些连接表?

2)为什么我不能像在SQL中一样快速加入两个表?

1 个答案:

答案 0 :(得分:2)

连接表允许两个独立表之间的关联的干净链接。加入表可以减少数据重复,同时可以在以后轻松查找数据中的关系

E.g。如果您比较一个名为users的表:

| id | name     |
-----------------
| 1  | Sara     |
| 2  | John     |
| 3  | Anthony  |

使用名为languages的表:

| id| title    |
----------------
| 1 | English  |
| 2 | French   |
| 3 | German   |
| 4 | Spanish  |

你可以看到两者真正存在于彼此不同的概念中。单个用户可能有多个订单的方式也不是从属于另一个<(其中每个订单行可能存储表示{的唯一 foreign_key )制作它的用户的{1}}。

当一种语言可以拥有许多用户,并且用户可以拥有多种语言时 - 我们需要一种方法来加入它们。

我们可以通过创建连接表(例如user_id)来存储用户语言之间的每个链接可以说每行包含对之间的每个匹配:

user_languages

通过这些数据,我们可以看到Sara(user_id:1)是三种语言,而John(user_id:2)和Anthony(user_id:3)只说英语。

通过在两个表之间创建连接表来存储链接,我们保留了对其他表上的数据进行强大查询的能力。例如,使用分隔| id | user_id | language_id | ------------------------------ | 1 | 1 | 1 | | 2 | 1 | 2 | | 3 | 1 | 4 | | 4 | 2 | 1 | | 5 | 3 | 1 | users的联接表,现在很容易找到说languagesUser或两者的每个English

但是当你添加新表时,连接表变得更加强大。如果将来我们想要将Spanish链接到名为languages的新表,我们可以简单地创建一个名为schools的新连接表。更好的是,我们可以添加此连接表,而无需对school_languages SQL表本身进行任何更改。

作为Rails模型,这些表之间的数据关系如下所示:

languages

默认情况下,每个学校和用户都会使用相同的language_id 链接到语言

这很有用。因为有两个连接表(User --> user_languages <-- Language --> school_languages <-- School &amp; user_languages)现在引用相同的唯一school_languages,现在可以很容易地编写关于如何相关的查询。例如,我们可以找到所有使用用户语言的学校,或找到所有使用该语言的用户。随着我们的表格的扩展,我们可以通过联接来找到关于我们数据中几乎任何内容的关系。

tl; dr:连接表可以保留不同概念之间的关系,从而可以在添加新表时轻松进行强大的关系查询。