외래 키와 연관 관계
GitLab 데이터베이스에서 외래 키(Foreign Key)를 추가·검증·제거·업데이트하는 방법과 관련 마이그레이션 전략을 설명합니다.
외래 키는 관련 데이터베이스 테이블 간의 일관성을 보장합니다. Rails 버전 4부터 Rails는 데이터베이스 테이블에 외래 키 제약을 추가하기 위한 마이그레이션 헬퍼를 제공합니다. Rails 4 이전에는 일정 수준의 일관성을 보장하는 유일한 방법이 연관 관계 정의의 dependent 옵션이었습니다. 애플리케이션 수준에서 데이터 일관성을 보장하는 방법은 불행한 상황에서 실패할 수 있으므로, 테이블에 일관성 없는 데이터가 남을 수 있습니다. 이는 주로 데이터베이스 수준에서 일관성을 보장하는 프레임워크 지원이 없었던 오래된 테이블에 영향을 미칩니다. 이러한 데이터 불일관성은 예상치 못한 애플리케이션 동작이나 버그를 유발할 수 있습니다. 다른 테이블의 레코드를 참조하는 테이블을 생성할 때는 데이터 무결성을 유지하기 위해 FK를 추가해야 합니다. 모델에 연관 관계를 추가할 때도 반드시 외래 키를 추가해야 합니다. 또한 외래 키를 추가할 때는 항상 인덱스 를 먼저 추가해야 합니다. 예를 들어, 다음과 같은 모델이 있다고 가정합니다. class User < ActiveRecord::Base has_many :posts end 여기서 칼럼 posts.user_id 에 외래 키를 추가합니다. 이렇게 하면 데이터베이스 수준에서 데이터 일관성이 강제됩니다. 외래 키는 또한 데이터베이스가 연관 데이터를 제거할 수 있음을 의미합니다(예: 사용자를 제거할 때), Rails가 이를 처리하는 대신 데이터베이스가 직접 처리합니다. 다운타임 및 마이그레이션 실패 방지 # 외래 키 추가에는 두 부분이 있습니다. FK 칼럼과 제약 추가. 데이터 무결성을 유지하기 위해 추가된 제약 검증. (1)은 가장 엄격한 잠금(ACCESS EXCLUSIVE)을 사용하는 ALTER TABLE 구문을 사용하며, 제약을 검증하려면 전체 테이블을 순회해야 하므로 대용량/고트래픽 테이블에서는 시간이 많이 걸립니다. 따라서 거의 모든 경우에 더 엄격한 잠금을 유지하고 테이블에 대한 다른 작업을 더 오래 차단하는 것을 피하기 위해 별도의 트랜잭션으로 실행해야 합니다. 새 테이블에서 # 새 테이블이 다른 하나의 테이블만 참조하는 경우에는 간단합니다. 참조되는 테이블에 관계없이 create_table (t.references, ..., foreign_key: true) 를 사용할 수 있습니다. 새 테이블이 두 개의 서로 다른 테이블을 참조하는 경우. 외래 키가 두 개일 때 새 테이블 생성 을 참조하세요. 새 칼럼에서 # 새로운(레코드가 많지 않은) 테이블이라면 아래 방법 중 하나를 사용할 수 있습니다. 외래 키를 두 개 추가해야 한다면, 동일한 마이그레이션에서 두 개 이상의 테이블을 잠그는 것을 방지하기 위해 서로 다른 마이그레이션으로 분리하세요. add_reference(… foreign_key: true) 동일한 트랜잭션에서 add_column(…)과 add_foreign_key(…) 실행. 그 외 모든 경우, 칼럼 추가, FK 제약 추가, 제약 검증은 별도의 트랜잭션에서 수행해야 합니다