[문과 코린이의 IT 기록장] RDBMS Modeling 기초 (RDBMS 개념, 테이블 만들기 - 학생 수강신청 관리 (문제), Key, Data Type, Primary Key(PK) 설계시 고려사항)
1. RDBMS 개념
1) 관계형 데이터베이스
- 데이터베이스(DB) : 구조화된 데이터들의 집합
- 관계형 데이터베이스 : 데이터들을, 2차원 배열과 같은, 테이블에 저장하고 관리
[ 관계 정의 ] * 테이블 간의 관계 존재
a. 1:M 관계 (부자지간 관계)
b. M:N 관계 (비즈니스 관계)
c. 1:1 관계 (부부 관계)
2) 관계형 데이터베이스 특징
a. 고유 식별자
: 하나의 테이블에는, 각 레코드를 식별하기 위한 고유 식별자(Primary Key = PK)가 존재한다.
: 고유 식별자는 NOT NULL, UNIQUE 속성을 가진다.
: 고유 식별자는, 하나 또는 여러개의 컬럼들로 정의할 수 있다.
b. 참조 무결성
: 테이블과 테이블 사이에서 나타나며, 하나의 테이블에서, 다른 테이블에 정의된 고유 식별자를 참조하는 외래키를 선언했을 때, 해당 외래키는 참조하는 고유 식별자의 값 범위를 넘을 수 없도록 제한하는 특성을 의미한다.
3) RDBMS 개념도
4) 테이블 구조
a. 테이블 (Table / Relation / Entity)
b. Column / Attribute / Property
- 테이블의 속성들의 집합
c. Row / Tuple / Record
- 하나의 속성들의 집합을 모아놓은 행
- Record(레코드)는 Row와 동의어
5) 주 식별자 (Primary Key)
- 하나의 레코드를 고유하게 구분할 수 있는 것으로, 하나의 컬럼 또는 여러 컬럼이 모여, Primary Key를 구성한다.
- Not Null과 Unqiue 속성을 지니고 있어야 한다.
- PK는 테이블 등록 시 명시해 주어야 한다.
2. 테이블 만들기 - 학생 수강신청 관리 (문제)
[ 학생 수강신청 관리 고려사항 ]
3. Key
1) PK(Primary Key)
- 하나의 테이블에서, 각 레코드를 고유하게 식별할 수 있는 컬럼 또는 컬럼의 조합
- 키 조건 : NOT NULL, UNIQUE
- 테이블 디자인 시, 키를 정하고, 테이블을 DB에 만들 때, 명시적으로 키를 선언한다.
- 키는 키에 대응하는 인덱스 테이블이 생성된다. * 인덱스 테이블은 키 값에 의해 정렬되어 있다.
2) 후보 키 (Candidate Key)
- 주 식별자가 될 가능성이 있는 식별자를 의미한다. * 식별자 = 후보 식별자 (주 식별자가 될 수 있는 후보)
주민번호 | 고객명 | 폰번호 | 이메일 | 집주소 | 고객번호 |
123456-7890123 | 홍길동 | 010-xxx | a@y.z | 경기도 | 1234 |
123456-7890124 | 이길동 | 010-xxx | b@y.z | 서울시 | 2345 |
123456-7890125 | 김길동 | 010-xxx | c@y.z | 서울시 | 3456 |
- NULL은 허용하지만, UNIQUE 해야 한다.
- 따라서 물리적으로 인스턴스의 유일성을 보장해주기 위해, 후보키는 Unique인덱스를 생성하는 것이 바람직하다.
[ 결정자(Determinate) -> 종속자 ]
a. 고객번호 -> 고객명 // 고객번호는 사업자가 임의로 부여한 정보임. 따라서 PK가 될 가능성이 가장 높음.
b. 주민번호 ->고객명 // 주민번호는 고객이 제공한 정보임. 고객이 제공한 정보는 일반적으로 주식별자로 채택 X
c. 폰번호 -> 고객명 // NULL 값을 가질 수 있음. 따라서 주식별자 불가능.
d. 이메일 -> 고객명 // NULL 값을 가질 수 있음. 따라서 주식별자 불가능.
[ 후보키들 중, 대표 키로 선정된 식별자는? ]
- 최소한 속성 조합이, 주 식별자가 되도록 해야 한다.
- 테이블 내, 각 레코드가 정확히 식별되도록 보장한다.
- 다양한 종류의 무결성을 설정하고, 강화하는 것을 도와준다.
- 테이블 관계를 설정하도록 해준다.
* PK가 없으면, 관계형 데이터베이스라고 할 수 없다. 왜냐하면 관계설정이 되어있지 못하기 때문이다.
4. Data Type
1) 정수
2) 실수
* Decimal : 4-16byte로, 정확한 소수점 그 자체를 나타낸다. (근사치값 X) 따라서, 화폐단위에서 주로 사용한다.
3) 문자
* varchar : 가변길이.
ex. Varchar(50) = 'AB' // 2byte만 메모리 공간 할당. 최대 50byte까지 가능.
// 그러나, 이는 키의 역할을 할 수 없으며, 정렬이 불가능함.
4) 유니코드
5) 날짜와 시간, 화폐
* 화폐 : moeny는 되도록 쓰지 않는다. 근사치값 오류 때문에, 화폐단위는 Decimal를 사용한다.
5. Primary Key(PK) 설계시 고려사항
1) Unique + 모든 레코드에 Not Null인 컬럼을 찾는다.
2) 후보 식별자가 없는 경우, 임의의 식별자(인조 식별자)를 만들어 부여한다.
- 인조 식별자 : 강제로 식별자 컬럼을 하나 더 만들어 식별자를 만드는 것
3) 레코드의 발생 가능한 최대 수를 적절하게 예측한 후, PK의 데이터 타입을 적절하게 결정해야 한다.
- 레코드 수가 정확하게 결정되는 테이블도 존재하지만 (ex. 고등학교 학년/반 관리 테이블), 시간을 축으로 데이터가 점차 쌓여가는, 즉 레코드 수를 정확하게 결정할 수 없는 테이블들도 존재한다. 후자와 같은 경우는, 연/월 등으로 나누어, 발생 빈도에 따라 어떻게 끊어야 할지 결정하면 된다.
4) PK의 데이터 타입 후보들을 대상으로, 다음을 고려한다.
a. int 등 숫자를 PK로 채택할 경우, 자동 증분 속성을 사용할 수 있다.
b. String을 사용하면, 숫자가 아닌 문자를 섞어, PK값에 의미를 부여할 수 있다.
* 특별한 의미를 부여할 필요가 없는 경우, 일반적으로 정수형을 사용하는 것이 바람직함
[ dbo.Student ] - 자동 증분 속성 사용
insert into Student values(1,'hong');
select * from Student;
-- 이 셋이 한번에 값을 입력하고자 했을 때, id는 기본키이므로 첫번째 A요원의 값만 저장되고, 나머지 값들은 저장되지 않는다.
-- A요원
insert into Student values(2,'hong');
-- B요원
insert into Student values(2,'Lee');
-- C요원
insert into Student values(2,'Kim');
-- [ PK 경쟁을 없애기 위한 해결방안 ]
-- 이 문제를 해결하기 위해 ID사양(ID Specification)을 예로 변경하여, 자동으로 값이 할당되도록, 들어온 순서대로 적용해주는 방법을 사용한다.
insert into Student Values('hong');
insert into Student Values('Lee');
insert into Student Values('Kim');
[ dbo.Student2 ] - 문자열을 통해, PK값에 의미 부여
5. PK는 고유 식별자 기능만 가지면 되며, PK에 어떤 의미를 부여하는 것은 좋지 않다.
- PK는 Unqiue, Not Null을 만족하기만 하면 되며, 어떠한 의미를 부여하고자 하는 것은 손해일 가능성이 높다. 의미를 부여해야 하는 경우는 다른 컬럼을 사용하자.
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |