Foreign Key 제대로 사용하기 3

7118 단어 sqlsql

📝 논리적 Foreign Key, 물리적 Foreign Key

실무에서 데이터베이스의 테이블을 살펴보다보면 어떤 테이블의 특정 컬럼이 Foreign Key로 설정되어야할 것 같은데 설정되지 않은 경우를 보게될 수도 있다.

어떤 테이블의 한 컬럼이 논리적으로 다른 테이블의 컬럼을 참조(reference)해야해서 개념상 Foreign Key에 해당하는 것과, 실제로 해당 컬럼을 Foreign Key로 설정해서 두 테이블 간의 참조 무결성을 지킬 수 있게 되는 것은 별개의 개념이다.

보통 이 둘을 나누어서 개념상 논리적으로 성립하는 Foreign Key를 논리적 Foreign Key라고 하고, DBMS 상에서 실제로 특정 컬럼을 Foreign Key로 설정해서 두 테이블 간의 참조 무결성을 보장할 수 있게 됐을 때 그 컬럼을 물리적 Foreign Key라고 한다.

물리적 Foreign Key로 설정한다면 참조 무결성이 보장되니까 좋을 텐데 왜 설정하지 않는 걸까 ❓ 바로 다음과 같은 문제들 때문이다.

  1. 성능 문제

실제 서비스에 의해 사용되고 있는 데이터베이스의 테이블들은 단 1초 내에도 수많은 조회(SELECT), 추가(INSERT), 갱신(UPDATE), 삭제(DELETE) 작업이 일어나고 있을 수 있다. 이럴 때 SQL 문 하나하나가 얼마나 빨리 실행되는지가 사용자의 만족도에 큰 영향을 미치게 된다.

물리적 Foreign Key가 있는 자식 테이블의 경우에는 INSERT, UPDATE 문 등이 실행될 때 약간의 속도 저하가 발생할 가능성이 있다. 왜냐하면 INSERT, UPDATE 문이 실행될 때 혹시라도 참조 무결성을 깨뜨리는 변화가 발생하지는 않을지 추가적으로 검증해줘야 하기 때문이다.

참조 무결성보다는 일단 당장 빠른 성능이 중요하다면 물리적 Foreign Key를 굳이 설정하지 않기도 한다. INSERT, UPDATE 문 등이 보다 더 빠르게 실행되도록 하고, 참조 무결성을 어기는 데이터들은 정기적으로 별도 확인 후에 삭제해주는 방식을 택하기도 한다.

  1. 레거시(Legacy) 데이터의 참조 무결성이 이미 깨진 상태라면 ❓

레거시(Legacy)라고 하는 용어가 있다. 프로그램의 기존 코드, 기존 데이터 등을 나타낼 때 사용하는 말이다.

레거시 데이터들을 살펴봤는데 그 회사가 그동안 물리적 Foreign Key 없이 데이터를 쌓아와서 참조 무결성을 어기는 row들이 생겨버린 상황이라면, 일단 참조 무결성을 어기는 row들을 과감하게 지워버린 후에 물리적 Foreign Key를 설정하는 방법이 있다. 하지만 만약 참조 무결성을 어기는 row들의 수가 많고, 그것들도 소중한 데이터라서 함부로 삭제할 수 없는 상황이라면 어떻게 해야할까?

그 뒤로 참조 무결성을 지킨다고 해도 이미 레거시 데이터 때문에 전체적인 차원에서의 참조 무결성은 깨져버린 상태이다. 바로 이런 현실적인 이유 때문에 그냥 물리적 Foreign Key없이, 참조 무결성을 지키는 것을 포기하고 서비스를 운영하는 곳들도 생겨난다.


📌 Foreign Key를 삭제하는 방법

SHOW CREATE TABLE review;

review 테이블의 CREATE TABLE 문을 확인해보면 테이블에 어떤 Foreign Key가 있는지 확인할 수 있다.

이 테이블에 fk_reveiw_table이라는 Foreign Key 제약사항이 걸려있다.

ALTER TABLE review
	DROP FOREIGN KEY fk_review_table;

위 코드를 통해 Foreign Key를 삭제할 수 있다.


📝 데이터베이스의 설계사항, 스키마

  • 각 테이블의 컬럼 구조, 각 컬럼의 데이터 타입과 속성
  • 테이블 간의 관계를 나타내는 Foreign Key

데이터베이스 안에 어떤 테이블들이 있고, 각 테이블의 컬럼 구조와 각 컬럼의 데이터 타입 및 속성이 어떻게 되고, 테이블 간의 관계는 어떻게 되는지 등과 같은 데이터 베이스에 관한 모든 설계사항스키마(Schema)라고 한다.

스키마를 짜는 것을 데이터베이스 모델링 또는 데이터베이스 디자인이라고 한다.

스키마에는 크게 2가지 종류가 있다.

  • 개념적 스키마는 위에서 설명한 내용이다. 하나의 조직, 하나의 기관, 하나의 서비스 등에서 필요로 하는 데이터베이스 설계사항을 의미한다.

  • 물리적 스키마는 데이터를 실제로 컴퓨터의 저장장치에 어떤 방식으로 저장할지를 경정하는 스키마이다. 저장 스키마 또는 내부 스키마라고도 한다.


✅ 과제 : Foreign Key 제대로 사용하기

어느 쇼핑몰 사이트의 데이터베이스 안에는 고객들의 주문 정보를 담고 있는 customer_order 테이블과, 각 주문의 현재 배송 상태 정보를 담고 있는 delivery 테이블이 있다.

customer_order

delivery

delivery 테이블의 order_id 컬럼을, customer_order 테이블의 id 컬럼을 참조하는 물리적 Foreign Key로 설정하려고 한다.

SQL 문을 써서 직접 oreign Key를 설정해보아라. 이때 Foreign Key의 이름은 fk_delivery_order로 한다.

부모 테이블의 row가 삭제되거나, Foreign Key에 의해 참조당하는 컬럼의 값이 갱신될 때에 관한 정책은

  • ON DELETE의 경우 그 row를 참조하던 자식 테이블의 row들의 컬럼에 NULL이 들어가도록 설정

  • ON UPDATE의 경우 그 row를 참조하던 자식 테이블의 row들의 컬럼도 같은 값으로 갱신되도록 설정

💻 풀이

ALTER TABLE delivery
ADD CONSTRAINT fk_delivery_order
FOREIGN KEY (order_id)
REFERENCES customer_order (id)
ON DELETE SET NULL
ON UPDATE CASCADE;
DELETE FROM customer_order WHERE id = 10000;
UPDATE customer_order SET id = 21000 WHERE id = 10001;

SELECT * FROM delivery;

👉 출력


📝 Foreign Key로 빠르게 파악하는 테이블 간의 관계

  • course_id 컬럼 → course 테이블의 id 컬럼
  • undergraduate_id 컬럼 → undergraduate 테이블의 id 컬럼

참조 관계가 성립하도록 물리적 Foreign Key를 설정하면 참조 무결성을 보장할 수 있게 된다.

만약 이 상태에서 professor라는 테이블을 추가한다고 가정하자.

  • professor 테이블을 추가
  • course 테이블의 professor 컬럼의 이름을 professor_id로 변경
  • professor_id 컬럼을 professor 테이블의 id 컬럼을 참조하는 Foreign Key로 설정

참고


좋은 웹페이지 즐겨찾기