안녕하십니까 다제입니다.
지금까지 SQL에 대해서 숨가쁘게 달려왔습니다.
이제 천천히 돌아서 생각을 해보겠습니다. 우리는 Foreign Key를 생성하는 방법에 대해서는 배웠습니다.
그러나, 부모테이블이나 자식테이블이 변경 또는 삭제될 때 Foreign Key는 어떻게 되는 것일까요?
결론부터 말씀을 드리자면,
RESTRICT, SET NULL, CASCADE 중에서 저희가 무엇으로 설정해주는지에 따라서 달라지게 됩니다.
이에, 해당 포스팅에서는 ①Foreign Key 정책과 ②논리적&물리적 Foreign Key에 대해서 알아보도록 하겠습니다.
1. Foreign Key 정책
1) RESTRICT 정책
-. 자식테이블에서 부모테이블을 참조하고 있는 것이 하나라도 있다면 그 부모테이블의 해당되는 row(record)는 "삭제"하거나 "업데이트" 할 수 없는 정책입니다.
-. 부모테이블이 "삭제"하거나 "업데이트"되었을 때 해당 row를 참조하고 있는 자식테이블에게 영향을 줄 수 있기 때문에 일반적으로 사용됩니다.
-. NO ACTION은 RESTRICT과같은 정책입니다.
2) SET NULL 정책
-. 부모테이블이 "삭제"하거나 "업데이트"되어도 해당 row를 참조하고 있는 자식테이블은 그대로 유지하고 싶을 때 사용하는 정책입니다.
-. "삭제"하거나 "업데이트"되면 자식 데이블에는 NULL값이 들어가게 됩니다.
3) CASCADE 정책
-. 부모테이블의 row를 "삭제"하거나 "업데이트"될 때 자식테이블의 row도 함께 "삭제"하거나 "업데이트"되는 정책입니다.
from django.db import models
from core import models as core_models
class List(core_models.TimeStampedModel):
"""List model Definition"""
name = models.CharField(max_length=80)
user = models.ForeignKey("users.User", on_delete=models.CASCADE)
rooms = models.ManyToManyField("rooms.Room", blank=True)
-. 사용되는 예
* 에어비엔비에서 방이 삭제되면, 해당 리뷰, 사진, 기타 해당 방과 관련된 모든 정보가 삭제될 때 유용하게 사용됨
* 인스타그램에서 계정을 삭제하였을 때 그 user의 사진 및 정보를 삭제될 때 유용하게 사용됨
참조 무결성은 데이터를 추가할 때 데이터를 삭제 할때 발생되는 중요한 특성입니다.
2. 논리적 & 물리적 Foreign Key
1) 논리적 Foreign Key
-. Foreign Key로 설정을 해주지 않았으나, 데이터의 논리적인 흐름상 동일한 데이터를 지칭하는 경우를 의미함
2) 물리적 Foreign Key
-. 논릴적 Foreign Key가 직접적으로 설정되어 있는 경우을 의미함
3) 논리적 Foreign Key를 사용하는 이유(성능문제)
-. 실제 서비스에서는 단 1초 내에도 수정, 삭제, 업데이트 등 수 많은 작업이 이루어짐
-. SQL 구문 하나 하나가 얼마나 빨리 실행되는지가 사용자의 편의를 높힐 수 있음
-. 물리적 Foreign Key가 많은 경우, 성능저하 문제를 야기시킬 수 있음(참조무결성 검토에 따른 지연)
4) 기타
-. Legacy : 프로그램의 기존 코드, 기존 데이터 등을 나타낼 때 사용하는 말입니다.
-. 개념적 스키마(Conceptual Schema) : 데이터베이스에 관한 모든 설계사항
-. 물리적 스키마(Physical Schema) 데이터를 실제로 컴퓨터의 저장장치에 어떤 방식으로 저장할지를 결정하는 스키마
위와 같이 ①Foreign Key 정책과 ②논리적&물리적 Foreign Key에 대해 알아보았습니다.
문의사항이 있으시면 언제든 댓글 부탁드립니다.
오늘도 방문해주셔서 감사합니다.
'Code > SQL' 카테고리의 다른 글
[MySQL 10] 논리적인 모델링(feat. Codestates _AI_BootCamp, 코드스테이츠) (0) | 2021.03.11 |
---|---|
[MySQL 9] MySQL data Modeling (feat. Codestates _AI_BootCamp, 코드스테이츠) (0) | 2021.03.11 |
MySQL 기초부터 훑어보기7(ALTER, TABLE) (2) | 2021.03.08 |
MySQL 기초부터 훑어보기6(Table) (0) | 2021.03.08 |
MySQL 기초부터 훑어보기5( Subquery, view) (0) | 2021.03.07 |