본문 바로가기
Database/SQL

[SQL] 데이터 모델링 기초 다시 잡기 (2)

by keyhong-DE 2023. 12. 24.

Key의 정의

하나의 테이블에서 각 레코드를 고유하게 식별할 수 있는 컬럼 또는 컬럼의 조합

1. Key의 조건은 NOT NULL, UNIQUE 이다.

  • 주식별자는 반드시 NOT NULL을 가진다.
  • 보조식별자는 NULL일 수도, NOT NULL일 수도 있다.
  • 주식별자는 하나만 지정 가능하다. NOT NULL과 UNIQUE 조건을 둘 다 만족하는 모든 보조식별자 중 하나이다.

2. 테이블 디자인 시 Key를 정하고 테이블을 만들 때 명시적으로 Key를 선언한다.

3. Key는 Key에 대응하는 인덱스 테이블에 생성된다.

  • 인덱스 테이블은 Key 값에 의해서 정렬되어 있다.

후보 키(Candidate Identifier)

주식별자가 될 가능성이 있는 식별자

모든 식별자는 주 식별자가 될 수 있는 후보이므로, 식별자와 후보 식별자는 사실상 동의어이다.

주식별자 찾기

1. 보조식별자: 주민번호, 폰번호, 이메일, 고객번호

2. 폰번호와 이메일은 가지고 있지 않은 사람이 있을 수도 있어 주식별자에서 탈락한다.

3. 주민번호도 오류 데이터를 허용하는 허점이 있어 조금 위험하다. 또한 고객들이 제공한 데이터는 보통 주식별자로 채택하지 않는다. 서비스 제공자 입장에서 주민번호를 확인 못하는 경우 어떻게 할 것인가? 100% 확신이 없다면 0%와 같다.

4. 고객번호는 자사가 회사가 확신을 가지고 유니크하게 부여한 번호이기 때문에 PK가 될 확률이 제일 높다.

5. 고객들로부터 얻어지는 3개의 후보 키(주민번호, 폰번호, 이메일)는 키로써 인덱스 테이블을 만들어서 하나의 레코드에 빠르게 접근하는 데 도움을 받을 수 있다.

결정자(Determinant)

이 값을 알면 나머지 속성 값도 알 수 있는 속성

  • 결정자가 결정이 되면, 종속적으로 따라오는 컬럼(종속자들)이 결정된다.
  • 결정자와 종속자 사이에는 Functional Dependency가 있다.
  • 위의 표를 예로, 고객번호가 결정자로 선택되면 (주민번호, 고객명, 폰번호, 이메일, 집주소)는 종속자들이 된다.
  • 표현 방법
FD 고객번호 -> 고객명
FD1 주민번호 -> 고객명
FD2 폰번호 -> 고객명
FD3 이메일 -> 고객명
  • 설명
  1. 왼쪽 결정자 속성이 모두 후보 식별자이다.
  2. NULL을 허용할 수 있다는 것이 주식별자와 다른점이다.
  3. 물리적으로 인스턴스의 유일을 보장해주기 위해서 UNIQUE 인덱스를 생성하는 것이 바람직하다.

Primary Key (PK)

테이블 컬럼에서 각 레코드를 유일하게 식별할 수 있는 컬럼 또는 컬럼들의 집합

후보 키 중에 대표 키로 선정된 식별자

  1. 최소한의 속성 조합이 주 식별자가 되도록 해야 한다.
  2. 테이블 내의 각 레코드가 정확하게 식별되도록 보장한다.
  3. 다양한 종류의 무결성을 설정하고 강화하는 것을 도와준다.
  4. 테이블 관계를 설정하도록 해준다.

** PK가 없으면 테이블 간의 관계도 설정할 수 없다.

** VARCHAR는 보통 VARCHAR(50)을 기본 값으로 설정한다.

** VARCHAR는 Index를 잡을 수도 없고, Primary Key로 참여할 수 없다. Sort도 되지 않는다. 보통 데이터 Field로 쓴다.

** CHAR vs VARCHAR : CHAR(N)은 N길이 보다 문자열이 적더라도 공백(blank)로 빈 공백을 채워넣는다. 반면, VARCHAR는 사용한 문자열 까지만 저장하므로 디스크 용량을 절약할 수 있다.

uniqueidentifier (MSSQL에만 있습니다.)

  • 16 Byte(전 세계에 어떤 사물이든 고유한 번호를 다 나눠줘도 충분할 만한 Range) 정도의 크기를 가진 고유한 ID 값을 준다.  이를 GUID(Global Unique IDentifier)라고 한다.
  • 사실상 8 Byte의 bigint만 해도 920경을 표현할 수 있으므로 써야 될 일이 없다고 봐도 무방하다. 
  • MySQL은 NEWID()와 유사하게 UUID()를 사용할 수 있다.
DECLARE @my_id uniqueidentifier

SET @my_id = NEWID()

PRINT 'Value of @myid is: ' + CONVERT(var

INSERT INTO TEST (UNIQUEID) VALUES (NEWID())

SELECT * FROM TEST

'Database > SQL' 카테고리의 다른 글

[SQL] 데이터 모델링 기초 다시 잡기 (1)  (0) 2023.12.24