【发布时间】:2016-10-26 11:47:58
【问题描述】:
所以我已经有一段时间没有玩编码游戏了,最近决定拿起铁轨。我对 Rails 中的 Join 表的 concept 有疑问。具体来说:
1) 为什么数据库中需要这些连接表?
2) 为什么我不能像在 SQL 中那样即时连接两个表?
【问题讨论】:
标签: ruby-on-rails
所以我已经有一段时间没有玩编码游戏了,最近决定拿起铁轨。我对 Rails 中的 Join 表的 concept 有疑问。具体来说:
1) 为什么数据库中需要这些连接表?
2) 为什么我不能像在 SQL 中那样即时连接两个表?
【问题讨论】:
标签: ruby-on-rails
连接表允许两个独立表之间的关联的干净链接。联接表可减少数据重复,同时便于日后查找数据中的关系。
例如如果你比较一个名为 users 的表:
| id | name |
-----------------
| 1 | Sara |
| 2 | John |
| 3 | Anthony |
使用名为 languages 的表:
| id| title |
----------------
| 1 | English |
| 2 | French |
| 3 | German |
| 4 | Spanish |
您可以看到两者确实作为彼此独立的概念存在。两者都不从属于另一个,因为单个用户可能有许多订单,(其中每个订单行可能存储一个唯一的foreign_key,代表@ 987654325@ 的用户)。
当一种语言可以有很多用户,而一个用户可以有多种语言时——我们需要一种方法来加入他们。
我们可以通过创建一个连接表(例如user_languages)来存储用户和他们可能使用的语言之间的每个链接.每行包含对之间的每场比赛:
| id | user_id | language_id |
------------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 4 |
| 4 | 2 | 1 |
| 5 | 3 | 1 |
通过这些数据,我们可以看到 Sara (user_id: 1) 会说三种语言,而 John(user_id: 2) 和 Anthony(user_id: 3) 只会说英语。
通过在两个表之间创建一个连接表来存储链接,我们保留了对其他表上的数据进行强大查询的能力。例如,使用分隔 users 和 languages 的连接表,现在可以很容易地找到每一个说出 English 或 Spanish 或两者的 User。
但是,当您添加新表时,连接表变得更加强大。如果将来我们想将languages 链接到一个名为schools 的新表,我们可以简单地创建一个名为school_languages 的新连接表。更好的是,我们可以添加这个连接表,而无需对languages SQL 表本身进行任何更改。
作为 Rails 模型,这些表之间的数据关系如下所示:
User --> user_languages <-- Language --> school_languages <-- School
默认情况下,每所学校和用户都将使用相同的 language_id(s)
链接到语言这很强大。因为现在有两个连接表(user_languages 和school_languages)引用了相同的唯一language_id,所以现在可以很容易地编写关于两者如何关联的查询。例如,我们可以找到使用用户语言的所有学校,或者找到使用学校语言的所有用户。随着表的扩展,我们可以利用连接来查找数据中几乎所有内容的关系。
tl;dr: 连接表保留了不同概念之间的关系,使您可以在添加新表时轻松进行强大的关系查询。
【讨论】: