관계형 DB
1. 개념
데이터베이스내의 테이블은 최소한의 의미(주제)를 가지는 테이블로 분리해서 구성하되, 그 테이블에 있는 컬럼을 연결한 것이다.
부모테이블:Primary Key 기본키
자식테이블:Foreign Key 외래키 형태로 연결된다.
분리된 테이블은 관계가 형성되는데 총 3가지 유형이 있다.
1) 1:1 관계
두 테이블간 어떤 테이블의 PK라도 다른 테이블에 전이되어도 상관없다
2) 1:N 관계
두 테이블간의 관계를 위해서 교차테이블 만들 필요 없다.
단, 1관계에 있는 PK를 N관계에 있는 테이블에 컬럼으로 전이시켜 관계를 맺는다.
예) 부서 ---- 사원
3) N:M 관계
두 테이블간의 관계를 위해서 교차테이블을 반드시 만든다
예) 학생-수강-과목
회원-예매-영화
회원-구매-물품
- Foreign Key로 두 테이블간의 데이터 무결성(결점이 없는)을 강제할수 있으며, JOIN작업으로 원하는 작업을 처리한다.
2. 개체 무결성
- 기본키에 속해 있는 속성은 NULL값을 가지지 못한다
- 기본키는 레코드간에 유일한 식별자이므로 물리적으로 NULL값이 올 수 없다
3. 참조무결성(FK제약조건)
- 테이블은 참조할 수 있는 외래키 값을 가질 수 있다
- 컬럼에 적용되는 3가지 제약조건
not null
no change->함부로 변하면 안됨
no duplicate
부모 테이블 | 자식 테이블 | |
입력 | 상관없음 | 반드시 부모테이블에 있는 데이터가 입력된다. |
수정 | 수정하려는 데이터가 자식 테이블에서 참조하고 있는지 검증 | 부모 테이블에 존재하는 다른 데이터로 변경 가능 |
삭제 | 삭제하려는 데이터가 자식 테이블에서 참조하고 있는 지 검증 | 제약없음 |
4. 정규화(Normalization)
중복성을 최소화하고 정보의 일관성을 보장하기 위한 개념
정규화의 목적
- 데이터베이스의 변경시 이상 현상 제거
- 데이터베이스 구조 확장시 재 디자인 최소화
- 사용자에게 데이터 모델을 더욱 의미있게
- 다양한 질의 지원
정규화의 종류
- 제1정규화 : 모든 속성은 반드시 하나의 값을 가져야 함 (원자값)
- 제2정규화 : 모든 속성은 반드시 기본키 전부에 종속되어야 한다(기본키 일부에만 종속되어서는 안됨)
- 제3정규화 : 기본키가 아닌 모든 속성 간에는 서로 종속될 수 없다(속성 간 종속성 배제)
관계형 DB 모델링을 위해서는 업무 분석이 선행되어야 한다.
관계형 DB 모델링을 도식화할 수 있는 프로그램으로 ER-WIN이 있다.
학사관리 업무 분석
- 학생이 수강신청. 수강신청 과목 목록. 수강신청 과목의 총 학점
- 해당 과목을 수강 신청한 학생 목록
- 학생, 과목, 수강 신청
모델링
위의 테이블은 좋지 못한 설계이다.
우선 NULL값이 너무 많다.
또한, 만약 개나리가 하나의 과목을 더 수강한다면 NULL 값이 또 발생한다.
이는 수강과목이라는 데이터를 추가할 때마다 열이 추가되고 있기 때문이다.
데이터를 추가할 때마다 열(가로 방향으로)이 추가되게 테이블을 설계하면 안된다.
행(세로 방향으로)이 추가되게 설계해야 한다.
이런 문제는 주제가 다른 정보를 하나의 테이블에 담으려고 하기 때문이다.
(여기서는 학생 정보와 수강과목이라는 다른 성격의 데이터가 존재한다.)
따라서 데이터의 성격이나 주제에 따라 분리하여 테이블을 설계해야 한다.
테이블 분리
학생에 관한 정보만 분리하여 테이블을 만드니 새로운 학생을 추가할 때마다 행이 추가된다.
제약조건을 한 번 걸어보자면
학번을 primary key로 지정해주고 이메일은 일반적으로 중복되는 것이 없으니 unique로 지정해준다.
수강과목에 대한 정보를 분리하여 과목 테이블을 만들었다. 이 역시 과목을 추가할 때마다 행이 추가된다.
과목명과 학점만 있을 경우 pk를 지정하기 어렵다. 따라서 과목구분코드를 만들어 이를 pk로 지정하자
구분코드는 보통 영문자와 숫자로 구성해서 만든다.
예) 남자 m, 여자 f / 프로그램 p, 디자인 d
이 두 개의 테이블은 다 : 다 (N:M) 관계이다.
수강 테이블은 학번과 과목구분코드를 통해 학생 테이블과 과목 테이블이랑 연결되어있다.
이때 학생 테이블은 부모 테이블, 수강테이블은 자식 테이블이라고 한다.
수강테이블의 학번과 과목구분코드는 중복값이 있어 pk로 지정할 수 없다. 따라서 일련번호를 만들어 pk로 지정해준다.
'웹개발 교육 > Database' 카테고리의 다른 글
[23일] Database (8) - 테이블 조인(inner join) (0) | 2022.08.26 |
---|---|
[22일] Database (7) - 학사관리 (0) | 2022.08.25 |
[21일] Database (5) - 문제 (0) | 2022.08.24 |
[20일] Database (4) - 2차 그룹, having 조건절, case when ~ then end 구문, 서브쿼리, 오라클 함수, NVL 함수, 모조 칼럼, 오라클 DB 자료형, Maria DB 자료형 (0) | 2022.08.23 |
[19일] Database (3) - 정렬, 시퀀스, sysdate, 제약조건, distinct, group by, 집계함수 (0) | 2022.08.22 |