관계 데이터 모델의 기본용어 들을 보니 어디서 본 용어들이다.
기억을 되짚어보니... 2019 KAKAO BLIND RECRUITMENT 문제: 후보키에 나왔구나?
당시 문제를 풀땐 무슨말인지 이해하느라 조금 고생했던 것 같은데, 지금 돌이켜보면 DB관련 문제였으니 당연히 관련 용어가 나왔을 뿐이다.
마치 국어의 비문학 지문처럼 배경지식이 있다면 수월하게 풀리는 종류의 문제...아마 문제를 낸 카카오측에서도 그러한 배경지식을 가진 사람을 걸러내기 위해 문제를 내지 않았을까?
아무튼 관계 데이터 모델링이 무엇인지 부터 파악해보자.
개념적 구조를 논리적 구조로 표현하는 논리적 데이터 모델이다. 하나의 개체에 대한 데이터를 하나의 릴레이션에 저장한다.
...😭 무슨 말인지 감히 안잡힌다. 본 챕터를 이해하기위해 꼭 알고있어야하는 단어의 뜻들을 한 번 살펴보자.
알듯 말듯하다.
릴레이션의 예시를 한 번 살펴보자.
고객릴레이션
차수는 6개, 카디널리티는 4개라고 정의할 수 있겠음!
대충 이해 가는듯 하고?🤔 보통 웹 사이트의 admin페이지에서 볼 수 있는 표들과 흡사하다.
릴레이션은 다음과 같이 구성된다.
릴레이션 스키마는 릴레이션의 논리적 구조다. 쉽게 말하자면 위에서 설명한 릴레이션이 들어있는 릴레이션 틀이라고 볼 수 있다.
릴레이션의 이름과 포함된 모든 속성의 이름으로 정의한다. 예를들어 고객 릴레이션은
고객개체에 포함된 속성들인 고객아이디, 고객이름, 나이 등급....으로 릴레이션 스키마가 이루어져있다.
또한 정적인 특징을 가진다.
=> 예를들어 고객개체에 주소라는 속성이 추가된다면 변화가 이루어지겠지만, 이는 잦은 변화를 의미하지는 않기에 정적이라고 표현한다.
인스턴스는 데이터베이스에 저장된 실제 값을 뜻한다고 하였다.
어느 한 시점에 존재하는 튜플들의 집합을 뜻한다.
또한 당연하게도 동적인 특징을 갖는다.
=> 이름, 나이 등은 쉽게 변하지 않으나 적립금, 등급, 닉네임...등은 쉽게 변한다.
데이터베이스 전체 구조를 말한다.(릴레이션 스키마들의 모음)
데이터베이스를 구성하는 릴레이션 인스턴스의 모음이다.
릴레이션을 아우르는 특성은 총 4가지가 있다.
튜플의 유일성을 지키기위하여 각 행은 구별되어야한다. 따라서 릴레이션에서 튜플들을 유일하게 구별하는 값이 필요한데 이게 바로 키다.
키는 그냥 만드는 게 아니라, 속성or속성들의 집합들로만 구성되며 아래와 같은 특성을 가진다.
꼭 필요한 최소한의 속성이란 뭘까? 키의 종류에서 알아보자.
슈퍼키(super key) : 유일성만 만족하는 키다. 즉, 최소성은 만족하지 않는다.
고객 릴레이션의 슈퍼키는 고객 아이디와 고객 아이디를 포함한 모든 속성집합이다.
아니, 적립금도 서로다른 값을 가지고있는데 구분되지 않느냐? 라고 할수도 있다.
=> 엄격근엄진지하게 말하자면 슈퍼키의 정의에 어긋나지는 않아보인다. 다만 데이터 베이스 설계관점에서 바라본다면 상식선에서 예측 가능한 미래의 데이터도 고려해야한다. 따라서 적립금, 나이, 이름, 직업은 중복될 우려가 존재하여 유일성을 만족하지 못한다고 판별한다.
후보키(candiate key) : 유일성, 최소성을 둘 다 만족하는 키다.
고객 릴레이션의 후보키는 고객 아이디하나만 존재한다. 만약 주소라는 속성이 존재했다면, 고객 이름+ 주소도 후보키로 가능했을지 모른다.(세대 구성원 중 동명이인은 일반적으로 고려하지 않는다)
기본키(primary key) : 후보키중 기본적으로 사용하기 위해 선택한 키를 뜻한다.
자연스레 고객 아이디가 기본키가 되겠다.
대체키(alternate key) : 기본키로 선택되지 못한 후보키 모음을 뜻한다.
집합으로 나타낸다면 다음과 같다.
기본키,대체키 ⊂ 후보키 ⊂ 슈퍼키
다른 릴레이션의 기본키를 참조하는 속성, 속성들의 집합(키)이다.
릴레이션 간의 관계를 나타내는 키다.
고객 릴레이션과 주문 릴레이션은 주문이라는 관계로 이루어져있다.
즉, 주문 릴레이션내 주문 고객의 정보는 고객 릴레이션의 고객 아이디와 일치한다.
따라서 참조할 수 있고, 이를 이용한 키를 외래키라고 한다.
당연한 말이지만 기본키와 외래키의 이름은 달라도 되지만(고객아이디 vs 주문고객), 도메인(자료형. 여기서는 char)은 같아야 한다.
또한 같은 릴레이션의 기본키를 참조하는 외래키도 정의 가능하며 외래키의 속성은 null값을 가질 수 있다!
무결성 제약조건