데이터베이스를 다루면 가장 기본적으로 pk와 fk에 대해서 '당연하게 사용해야 하는 것' 이라는 것만 알고 있지 어떤 의미이며 왜 사용해야 하는지에 대해서 모르고 있었기 때문에 정리를 하려 한다.
KEY란?
데이터베이스에서 조건에 만족하는 튜플을 찾거나 순서대로 정렬할 때 튜플들을 서로 구분할 수 있는 기준이 되는 어트리뷰트를 말한다.
즉 테이블에서 데이터를 구분하여 쉽게 찾기 위해 설정 하는 것 이라는 의미로 생각 된다.
1. PK
1. 기본키는 후보키 중에서 선택한 주키(Main Key)이다.
2. 한 릴레이션(테이블인것 같다)에서 특정 튜플을 유일하게 구별할 수 있는 속성이다.
3. Null값을 가질 수 없다.
4. 기본키로 정의된 속성에는 동일한 값이 중복되어 저장될 수 없다.
(중복되지 않고 유일하게 구별 가능한 속성)
후보키란?
릴레이션을 구성하는 속성들 중에서 튜플을 유일하게 식별하기 위해 사용하는 속성들의 부분집합, 즉 기본키로 사용할 수 있는 속성들을 말한다.
하나의 릴레이션내에서는 중복된 튜플들이 있을 수 없으므로 모든 릴레이션에는 반드시 하나 이상의 후보키가 존재한다.
후보키는 릴레이션에 있는 모든 튜플에 대해서 유일성과 최소성을 만족시켜야 한다.
유일성 : 하나의 키값으로 하나의 튜플만을 유일하게 식별할 수 있어야한다.
최소성 : 모든 레코드들을 유일하게 식별하는데 꼭 필요한 속성만으로 구성되어 있어야한다.
2. FK
1. 관계를 맺고 있는 릴레이션 R1,R2에서 릴레이션 R1이 참조하고 있는 릴레이션 R2의 기본키와 같은 R1 릴레이션의 속성을 외래키라고 한다.
2. 외래키는 참조되는 릴레이션의 기본키와 대응되어 릴레이션 간에 참조관계를 표현하는데 중요한 도구이다.
(어떤 릴레이션의 기본 키를 참조하는 애트리뷰트)
-출처 : https://coding-factory.tistory.com/220
FK의 사용 이유
foreign key를 사용하는 이유는 참조 무결성을 위해서이다. 연관관계에 있는 테이블에서, 외래키로 지정된 컬럼 데이터가 부모의 기본키 외 다른 값을 가질 수 없게 하여 외래키 컬럼에 저장될 수 있는 데이터를 제어하게 된다.
예를 들어, 유저, 주문 테이블이 있고 주문 테이블에 foreign key로 유저의 primary key를 갖고 있다 하면, 아직 가입 안된 유저 id로 주문테이블에 데이터를 넣으려하면 에러를 발생시켜 해당 데이터 삽입을 막는다. 이를 통해 주문 테이블 내에서 참조하는 값이 존재한다는 것을 보장할 수 있다. 즉 참조하는 테이블의 무결성을 높여주게 된다.
실무에서 FK를 사용 안하는 이유
DB설계를 할 때에 FK를 미리 설정 할 수 있다. 그치만 실제 테이블을 생성할 때에는 FK를 설정하지 않고 PK만 설정하고 테이블을 생성하는 경우가 많았다.
관리포인트 증가
- 테스트 등 진행시에 부모 row없이 자식 테이블 테스트만 하는 것이 불가능하다.
- 트랜잭션 안에서 부모-자식 테이블 관계에 따라 작업 순서가 필요하다.
- 규모가 증가함에 따라 데이터베이스의 설계도 조금씩 달라지는데 이 경우 참조무결성으로 인해 더 큰 수정개발을 불러 일으킬 수도 있다.
- 실수로 데이터 변경하거나 지웠는데 연관관계에 있는 다른 테이블에까지 영향이 미치게 된다.
출처 : https://velog.io/@destiny1616/Foreign-Key-07mrx6w4
실제 신규 개발 프로젝트에 참여 했을 때에는 테이블을 생성하더라도 해당 테이블이 값이 고정이 된 경우가 드물었다. 기획은 계속 변화하고, 여러 기능과 정보를 담기 위해서는 테이블의 컬럼값들을 변화시켜야 했기 때문에 그 이유로 FK를 지정하지 않고 개발을 했었다.
실제 하던 프로젝트가 중단되어서 개발이 더이상 진행 되지 못하는 상황이었기 때문에 이후 작업을 하지 못한점이 아쉽다.
조인
조인이란?
- 테이블 결합이라는 뜻
조인의 사용 이유
- 테이블을 결합해야 필요한 정보를 얻을 수 있기 때문
(*한 테이블에 정보를 몰아서 담아두면 데이터의 중복이 생겨나기 때문에 해당 현상을 방지 하기 위하여 테이블을 분할 하여 정보를 저장한다.)