복합 기본 키란?

때때로 단일 열의 값만으로는 테이블의 각 행을 고유하게 식별하기 어려울 때가 있습니다. 이 경우 두 개 이상의 열 조합이 필요할 수 있습니다. 이는 단일 id 열이 없는 레거시 데이터베이스 스키마를 사용하거나 샤딩 또는 멀티테넌시를 위해 스키마를 변경할 때 발생할 수 있습니다.

복합 기본 키는 복잡성을 높이고 단일 기본 키 열보다 느릴 수 있습니다. 사용 사례에 복합 기본 키가 필요한지 확인하십시오.

복합 기본 키 마이그레이션

create_table:primary_key 옵션을 배열로 전달하여 복합 기본 키가 있는 테이블을 만들 수 있습니다:

class CreateProducts < ActiveRecord::Migration[7.2]
  def change
    create_table :products, primary_key: [:store_id, :sku] do |t|
      t.integer :store_id
      t.string :sku
      t.text :description
    end
  end
end

모델 쿼리하기

#find 사용하기

테이블에 복합 기본 키가 있는 경우 #find를 사용할 때 배열을 전달해야 합니다:

# store_id 3이고 sku가 "XYZ12345"인 제품 찾기
irb> product = Product.find([3, "XYZ12345"])
=> #<Product store_id: 3, sku: "XYZ12345", description: "Yellow socks">

위의 SQL 문은 다음과 같습니다:

SELECT * FROM products WHERE store_id = 3 AND sku = "XYZ12345"

여러 개의 복합 ID를 가진 레코드를 찾으려면 배열의 배열을 #find에 전달하세요:

# 기본 키가 [1, "ABC98765"]와 [7, "ZZZ11111"]인 제품 찾기
irb> products = Product.find([[1, "ABC98765"], [7, "ZZZ11111"]])
=> [
  #<Product store_id: 1, sku: "ABC98765", description: "Red Hat">,
  #<Product store_id: 7, sku: "ZZZ11111", description: "Green Pants">
]

위의 SQL 문은 다음과 같습니다:

SELECT * FROM products WHERE (store_id = 1 AND sku = 'ABC98765' OR store_id = 7 AND sku = 'ZZZ11111')

복합 기본 키가 있는 모델은 전체 복합 기본 키를 사용하여 정렬됩니다:

irb> product = Product.first
=> #<Product store_id: 1, sku: "ABC98765", description: "Red Hat">

위의 SQL 문은 다음과 같습니다:

SELECT * FROM products ORDER BY products.store_id ASC, products.sku ASC LIMIT 1

#where 사용하기

#where에 대한 해시 조건은 튜플 형식으로 지정할 수 있습니다. 이는 복합 기본 키 관계를 쿼리할 때 유용할 수 있습니다:

Product.where(Product.primary_key => [[1, "ABC98765"], [7, "ZZZ11111"]])

복합 기본 키 모델 간 연관관계

Rails는 종종 추가 정보 없이도 복합 기본 키가 있는 모델 간 기본 키-외래 키 정보를 추론할 수 있습니다. 다음 예를 보세요:

class Order < ApplicationRecord
  self.primary_key = [:shop_id, :id]
  has_many :books
end

class Book < ApplicationRecord
  belongs_to :order
end

여기서 Rails는 has_many / belongs_to 연관관계와 마찬가지로 :id 열을 연관관계의 기본 키로 사용해야 한다고 가정합니다. books 테이블의 외래 키 열은 :order_id라고 추론합니다.

복합 기본 키 모델의 폼

복합 기본 키 모델에 대한 폼도 작성할 수 있습니다. 폼 빌더 구문에 대한 자세한 내용은 폼 헬퍼 가이드를 참조하세요.

복합 키 매개변수

복합 키 매개변수에는 하나의 매개변수에 여러 값이 포함됩니다. 따라서 각 값을 추출하고 Active Record에 전달할 수 있어야 합니다. extract_value 메서드를 사용할 수 있습니다.

복합 기본 키 고정 데이터

복합 기본 키 테이블의 고정 데이터는 일반 테이블과 매우 유사합니다. id 열을 사용할 때는 열을 생략할 수 있습니다. 그러나 복합 기본 키 관계를 지원하려면 composite_identify 메서드를 사용해야 합니다.