#Railsの自己結合
はじめに
今回は自己結合についてです。バックエンドっぽいです。土日が待ち遠しいです。
頑張ります。
##自己結合とは##
そもそも結合って?
2つのリレーションに対し、指定した条件を満たすように1つのリレーションへと統合すること。
内部結合、外部結合など結合の仕方は色々あります。今回はその中の一つ自己結合についてです。
なんで結合するん?
例えば下記のようなリレーションが二つあります。
人物リレーション
id | name | country_id |
---|---|---|
1 | taro | 1 |
2 | jiro | 1 |
3 | tom | 2 |
国リレーション
id | name |
---|---|
1 | japan |
2 | America |
3 | India |
taroの国はどこだっけ?となった時、人物リレーションから住む国のidを調べ、次に国リレーションから該当する国を見つける。二回リレーションを見るわけです。面倒です。なので結合してリレーションを見るのは一回にします。
今回の場合は内部結合でくっつけると下記のようになります。
id | name | country_id | id | name |
---|---|---|---|---|
1 | taro | 1 | 1 | japan |
2 | jiro | 1 | 1 | japan |
3 | tom | 2 | 2 | America |
taroの国はtaroの行を見れば一瞬でわかりますね。
このように結合は検索を楽にしてくれるのです。
自己結合って?
上の例では内部結合でした。二つのリレーションを結合しています。
ですが、自己結合とは同じ一つのリレーションを結合するのです。.....??
例を見せた方が早いですね。
id | name | firend_id |
---|---|---|
1 | taro | 2 |
2 | jiro | 1 |
3 | tom | 1 |
上記の場合、taro君の友達を探す時、taroの行のfirend_idをみる。次にそのidで探す。さっきと同じく二度手間です。
てな訳で結合します。イメージしにくいですが、上のリレーションと全く同じのがあったとして結合するとイメージしてみてください。そうすると以下のようになります。
id | name | firend |
---|---|---|
1 | taro | jiro |
2 | jiro | taro |
3 | tom | taro |
これで友達が一目瞭然になりました。これが自己結合です。
##まとめ
今日は少なめです... 明日はRDMなので...
続きは、以上をふまえて明日、railsでの自己結合を掘り下げていこうと思います。
##参考にしたの
SQL素人でも分かるテーブル結合(inner joinとouter join)
https://qiita.com/naoki_mochizuki/items/3fda1ad6594c11d7b43c
Active Record の関連付け (アソシエーション)
https://railsguides.jp/association_basics.html#%E8%87%AA%E5%B7%B1%E7%B5%90%E5%90%88