복합 기본 키란?
때때로 단일 열의 값만으로는 테이블의 각 행을 고유하게 식별하기 어려울 때가 있습니다. 이 경우 두 개 이상의 열 조합이 필요할 수 있습니다. 이는 단일 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
메서드를 사용해야 합니다.