2016-10-26 3 views
1

Also war ich eine Weile aus dem Coding-Spiel raus und habe mich vor kurzem dazu entschieden, Rails aufzunehmen. Ich habe eine Frage über das Konzept von Join-Tabellen in Schienen. Speziell:Ruby on Rails: Tabellen beitreten Concept

1) Warum werden diese Join-Tabellen in der Datenbank benötigt?

2) Warum kann ich nicht einfach zwei Tabellen gleichzeitig verbinden wie in SQL?

Antwort

2

Eine Join-Tabelle ermöglicht eine saubere Verknüpfung der Zuordnung zwischen zwei unabhängigen Tabellen. Join Tabellen reduzieren Datenduplikation während es leicht zu finden Sie Beziehungen in Ihren Daten später.

z. Wenn Sie eine Tabelle vergleichen users genannt:

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

mit einem Tisch languages genannt:

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

können Sie sehen, dass beide wirklich existieren als separate Konzepte voneinander. Weder untergeordnet ist zu dem anderen dem Weg eines einzelner Benutzer viele Aufträge aufweisen kann, (wobei jede Zeile, um ein einzigartiges FOREIGN_KEY speichern könnte die user_id des Benutzers darstellt, der es gemacht).

Wenn eine Sprache viele Benutzer haben kann und ein Benutzer viele Sprachen haben kann - wir brauchen eine Möglichkeit, ihnen beizutreten.

können wir tun, dass eine Join-Tabelle, wie user_languages, indem jede Verbindung zwischen einem Benutzer zu speichern und der Sprache (n), dass sie sprechen können. Mit jeder Zeile jedes matchup zwischen den Paaren enthält:

| id | user_id | language_id | 
------------------------------ 
| 1 | 1  | 1   | 
| 2 | 1  | 2   | 
| 3 | 1  | 4   | 
| 4 | 2  | 1   | 
| 5 | 3  | 1   | 

Mit diesen Daten können wir sehen, dass Sara (user_id: 1) ist dreisprachig, während John (user_id: 2) und Anthony (user_id: 3) nur Englisch sprechen .

Durch Erstellen einer Join-Tabelle zwischen den beiden Tabellen zum Speichern der Verknüpfung behalten wir unsere Fähigkeit bei, leistungsstarke Abfragen in Bezug auf Daten in anderen Tabellen zu erstellen. Zum Beispiel wäre es mit einer Join-Tabelle, die users und languages trennt, einfach, alle User zu finden, die English oder Spanish oder beide sprechen.

Aber wo Join-Tabellen noch leistungsfähiger werden, wenn Sie neue Tabellen hinzufügen. Wenn wir zukünftig languages mit einer neuen Tabelle namens schools verknüpfen wollten, könnten wir einfach eine neue Join-Tabelle namens school_languages erstellen. Noch besser, wir können diese Join-Tabelle hinzufügen, ohne die SQL-Tabelle languages selbst ändern zu müssen.

Als Rails-Modelle, die Datenbeziehung zwischen diesen Tabellen würde wie folgt aussehen:

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

standardmäßig würde jede Schule und Benutzer Sprache die gleiche language_id (n)

mit verknüpft werden Das ist mächtig. Da mit zwei Join-Tabellen (user_languages & school_languages) nun die gleiche eindeutige language_id referenziert wird, wird es jetzt einfach sein, Abfragen darüber zu schreiben, wie sich beide beziehen. Zum Beispiel könnten wir alle Schulen finden, die die Sprache (n) eines Benutzers sprechen, oder alle Benutzer finden, die die Sprache (n) einer Schule sprechen. Wenn sich unsere Tabellen erweitern, können wir die Verknüpfungen verwenden, um Beziehungen zu so ziemlich allem in unseren Daten zu finden.

tl; dr: Verbindungstabellen erhalten Beziehungen zwischen einzelnen Konzepten, so dass beim Erstellen neuer Tabellen problemlos relationale Abfragen erstellt werden können.

+1

Vielen Dank für das Zeigen des großen Bildes !!! So hilfreich! –