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 |