【问题标题】:Ruby on Rails: Join Tables ConceptRuby on Rails:连接表概念
【发布时间】:2016-10-26 11:47:58
【问题描述】:

所以我已经有一段时间没有玩编码游戏了,最近决定拿起铁轨。我对 Rails 中的 Join 表的 concept 有疑问。具体来说:

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

2) 为什么我不能像在 SQL 中那样即时连接两个表?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    连接表允许两个独立表之间的关联的干净链接。联接表可减少数据重复,同时便于日后查找数据中的关系

    例如如果你比较一个名为 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) 只会说英语。

    通过在两个表之间创建一个连接表来存储链接,我们保留了对其他表上的数据进行强大查询的能力。例如,使用分隔 userslanguages 的连接表,现在可以很容易地找到每一个说出 EnglishSpanish 或两者的 User

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

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

    User --> user_languages <-- Language --> school_languages <-- School
    

    默认情况下,每所学校和用户都将使用相同的 language_id(s)

    链接到语言

    这很强大。因为现在有两个连接表(user_languagesschool_languages)引用了相同的唯一language_id,所以现在可以很容易地编写关于两者如何关联的查询。例如,我们可以找到使用用户语言的所有学校,或者找到使用学校语言的所有用户。随着表的扩展,我们可以利用连接来查找数据中几乎所有内容的关系。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 2010-10-20
      • 1970-01-01
      相关资源
      最近更新 更多