InfoGrab DocsInfoGrab Docs

외래 키와 연관 관계

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 제약 추가, 제약 검증은 별도의 트랜잭션에서 수행해야 합니다