[ruby] 테이블 3개 조인

Inner join과 left join

INNER JOIN은 두 개의 테이블 간에 공통된 값을 가진 행만을 반환한다.

LEFT JOIN은 첫 번째 테이블의 모든 행과 두 번째 테이블에서 조건을 만족하는 행을 반환한다. 따라서 LEFT JOIN은 첫 번째 테이블의 모든 행을 포함하며, 두 번째 테이블과 일치하는 행이 없으면 NULL 값을 반환한다.

 

3개 테이블 조인

외래키 조건

user.id == order.user_id

ordder.id == receipt.order_id

 

모델 클래스 정의. 각 모델은 데이테베이스의 테이블과 연결된다.

class User < ActiveRecord::Base
  has_many :orders
end

class Order < ActiveRecord::Base
  belongs_to :user
  has_one :receipt
end

class Receipt < ActiveRecord::Base
  belongs_to :order
end

 

Inner join 예제

user_order_recipt = User.joins(orders: :receipt)

user_order_recipt.each do |user|
  puts "User: #{user.name}, Order ID: #{user.orders.first.id}, Receipt ID: #{user.orders.first.receipt.id}"
end

 

left join 예제

user_order_recipt = User.left_joins(orders: :receipt)

user_order_recipt.each do |user|
  if user.orders.first && user.orders.first.receipt
    puts "User: #{user.name}, Order ID: #{user.orders.first.id}, Receipt ID: #{user.orders.first.receipt.id}"
  else
    puts "User: #{user.name}, Order ID: None, Receipt ID: None"
  end
end

 

N+1 쿼리

N+1 쿼리는 데이터베이스에서 발생하는 성능 문제 중 하나이다. 이 문제는 다음과 같은 상황에서 발생한다:

하나의 기본 쿼리(N)를 실행한 후, 그 결과로 반환된 각 행에 대해 추가적인 조회(1개씩)를 해야 할 때(N+1). 이로 인해 데이터베이스에 부하가 걸리고 불필요한 쿼리 실행이 늘어난다.

SELECT * FROM Orders; # 결과값 N개
SELECT * FROM OrderItems WHERE OrderID = {주문 ID}; # 결과값 N개에 대하여 추자적으로 쿼리가 +1개씩 실행됨.

N+1 쿼리 문제를 해결하기 위한 방법 중 하나는 JOIN을 사용하여 한 번의 쿼리로 필요한 모든 데이터를 가져오는 것이다.

 

 

'┝ 개발 언어 > ┝ ruby' 카테고리의 다른 글

[ruby] .map 메서드  (0) 2023.08.31
[ruby] 모델 테스트하는 방법  (0) 2023.08.10
[ruby] orm : unscoped  (0) 2023.07.24
[ruby] validates_inclusion_of  (0) 2023.07.18
[ruby] 변수 앞의 @  (0) 2023.07.10