PK(Primary Key)와 FK(Foreign Key)는 무엇인가?
1. PK (Primary Key, 주키, 주식별자, 결정인자)
테이블의 모든 데이터를 유일하게 식별해주는 컬럼이다. 테이블은 무조건 PK를 가지고 있다.
PK는 단 한 번만 선언 가능하다.
2. FK (Foreign Key, 외부키, 외부 식별자)
테이블간 관계(Relationship)을 의미하며 테이블은 참조를 당하는 경우가 아니라면 무조건 FK를 가지고 있다.
글로 볼 내용은 아니고 바로 그림으로 넘어가자.
여기 Customer라는 테이블과 Car라는 테이블이 존재한다.
각각 CustomerId와 CarId를 고유키로 가지고 있고 둘은 아무런 상관 관계가 없다.
물론 쿼리문을 통해 둘을 동시에 출력할 방법은 있지만 그렇다고 둘 사이에 없던 관계가 생기는 것은 아니다.
이들은 완전히 남남으로써 존재한다.
이런 혼자서 존재할 수 있는 테이블을 Master Table이라고 부른다.
Order라는 새로운 테이블이 생성되었다.
이 Order라는 테이블은 어떤 고객이 어떤 차를 언제 샀는지 기록하는 것이 존재 의의이기 때문에 혼자서는 아무런 존재 의미가 없는 테이블이다.
이렇게 중간에서 징검다리 역할을 해주는 테이블을 Relational Table(관계 테이블)이라고 부른다.
그럼 이들이 어떻게 연결될 수 있을까?
Order에서 CustomerId와 CarId를 가지고 있지만 이들은 지금 아무런 의미도 없다.
그냥 Car와 Customer 테이블에 존재하는 컬럼과 이름만 같을 뿐 아무 관계도 아니다.
이럴 때 필요한 것이 바로 PK와 FK이다.
Order의 CustomerId와 CarId에 각각 FK를 부여함으로써 Order는 Car와 Customer 테이블을 참조하게 되었다.
화살표의 방향이 가르키는 쪽이 '참조를 당하고 있는 테이블'이고 가르키는 쪽이 '참조하고 있는 테이블'이라고 부른다.
이 그림을 보면 1대다 관계와 다대다(n대n) 관계라는 글이 적혀있는데 말 그대로 하나의 CustomerId를 참조하는 Order의 레코드가 여러개가 될 수 있음을 의미한다.
쉽게 설명하자면 우리가 가게에 들어가서 여러 물건을 살 수는 있지만, 물건을 여러개 사기 위해 내가 동시에 여러명으로 늘어나지는 않는다.
Customer는 한 개의 키(PK)에 한 개의 레코드만을 가지고 Order는 한 개의 CustomerId(FK)에 의해 여러 레코드를 가질 수 있다.
또한 여기서 Customer와 Car는 서로 동등하게 증가하는 N대N의 관계를 가지는데, 이런 경우 우리는 이들이 직접적으로 교류하지 않고 자식 테이블을 통해서 교류할 수 있도록 설계한다.
마스터 테이블과 관계형 테이블의 관계를 부모와 자식으로도 표현하는데 내 글자를 해석할 수 있다면 why 부모?라고 필기해놓은 부분을 참고하도록 하자.
추가적으로 PK는 단 한 번만 선언할 수 있으나, 그것이 한 개의 컬럼에만 선언할 수 있다는 의미는 아니다.
이게 무슨 말이냐면 PK가 동시에 여러개 존재할 수 있지만 PK가 따로따로 적용되는 것이 아니라 셋이 합쳐서 제약 조건을 가지게 된다는 것이다.
위의 경우 CustomerId, CarId, OrderDate 모두에게 PK를 선언했으므로 CustomerId와 CarId가 중복되고 OrderDate는 중복되지 않는 레코드는 여러 개 존재할 수 있으나, OrderDate까지 중복된다면 사용할 수 없다.
PK와 FK는 RDBMS에 굉장히 중요한 요소로써 이렇게 간단한 스키마에서는 한 눈에 보이지만 복잡한 설계에서는 쉽게 눈에 들어오지 않으니 꾸준히 연습하는 수 밖에 없다..
'CS ﹒ Algorithm > Database' 카테고리의 다른 글
데이터베이스 (6) 설계 2 - N : 1 관계, 재귀적 관계 (3) | 2022.08.26 |
---|---|
데이터베이스 (5) 설계 1 - Key 설계 (0) | 2022.08.23 |
데이터베이스 (4) 뷰 & 프로시저 & FUNCTION & 트리거 (Feat. MySQL) (3) | 2022.08.20 |
데이터베이스 (3) JOIN문 입문하기 (Feat. MySQL) (0) | 2022.08.17 |
데이터베이스 (1) 관계형 데이터베이스/SQL의 구성과 간단한 용어 정리 (0) | 2022.08.11 |