所以我已经离开了编码游戏一段时间,最近决定拿起铁轨。我对rails中的Join表的概念有疑问。具体做法是:
1)为什么数据库中需要这些连接表?
2)为什么我不能像在SQL中一样快速加入两个表?
答案 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
的联接表,现在很容易找到说languages
或User
或两者的每个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:连接表可以保留不同概念之间的关系,从而可以在添加新表时轻松进行强大的关系查询。