본문 바로가기

문과 코린이의, [C#] 기록/문과 코린이의, [SQL] 기록

[문과 코린이의 IT 기록장] RDBMS Modeling 기초 (RDBMS 개념, 테이블 만들기 - 학생 수강신청 관리 (문제), Key, Data Type, Primary Key(PK) 설계시 고려사항)

반응형

[문과 코린이의 IT 기록장] RDBMS Modeling 기초 (RDBMS 개념, 테이블 만들기 - 학생 수강신청 관리 (문제), Key, Data Type, Primary Key(PK) 설계시 고려사항)

[문과 코린이의 IT 기록장] RDBMS Modeling 기초 (RDBMS 개념, 테이블 만들기 - 학생 수강신청 관리 (문제), Key,  Data Type, Primary Key(PK) 설계시 고려사항)

 


 

RDBMS Modeling 기초 - 인프런 | 강의

본 강좌는 데이터베이스 설계 이론을 실습 위주로 쉽게 풀어냈습니다. 책 등을 통해서 경험하신 분들은 대부분 데이터베이스 이론이 어렵다고 느끼고 포기하신 경험들이 있을 겁니다. 저도 그

www.inflearn.com


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 ] - 자동 증분 속성 사용

dbo.Student Design
dbo.Student - StudentId 속성

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');

PK경쟁 해결방안 결과

 

[ dbo.Student2 ] - 문자열을 통해, PK값에 의미 부여

dbo.Student2 Design - 문자열은 자동증분 지원 X

 

 

5. PK는 고유 식별자 기능만 가지면 되며, PK에 어떤 의미를 부여하는 것은 좋지 않다.

- PK는 Unqiue, Not Null을 만족하기만 하면 되며, 어떠한 의미를 부여하고자 하는 것은 손해일 가능성이 높다. 의미를 부여해야 하는 경우는 다른 컬럼을 사용하자.

 


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형