[데이터베이스 첫걸음] 8장 테이블 설계의 기초
관계형 데이터베이스에서 테이블에 데이터를 저장하고 관리한다.
테이블 : 관계형 데이터베이스에서 모든 데이터가 테이블에 공통적인 요소의 집합으로 구분되어 저장된다. 관련성이 있는 데이터를 저장하고 관리하기 때문에 행 사이에 공통적인 요소가 있어야 한다.
✔️ 고유한 기본키를 가진 공통점에 의해 정리된 것들의 집합
테이블 설계 : 다양한 데이터를 테이블에 저장하는 기준
- 테이블 설계 규칙
- 테이블은 '어떤 공통의 속성을 가진 것의 집합'. 테이블명은 반드시 복수형 혹은 집합 명사.
- 공통점을 무시하면 안된다 (관련성 없는 데이터의 집합 X)
- 테이블은 현실의 개념이나 집합을 나타낸 것
- 열은 개체의 속성이다. (OOP관점의 표현 )
- 테이블- 메소드 없는 클래스
- Row - 인스턴스
- Column - attribute(속성)
- 열은 개체의 속성이다. (OOP관점의 표현 )
- 사물과 집합의 계층성을 무시하면 안된다.(상위 계층 -채소, 하위 계층 - 옥수수, 토마토 ..)
➡️ 테이블의 구분은 가장 상위의 개념 집합으로 정리, 일반적 속성의 차이는 열로 표현한다.
(어플리케이션에 대한 유연성) - 테이블의 이름을 바꾸는것은 어플리케이션에 영향이 크다.
- 반드시 기본키를 설정할 것 (데이터 관리 기본)
- 한 개의 테이블 내용에는 중복 행을 허용하지 않는다.
- 중복행 허용시 → 자신의 데이터를 찾을 수 없거나, 타인의 데이터도 볼 수 있다.
→ 서비스 심각한 장애 직결
- 중복행 허용시 → 자신의 데이터를 찾을 수 없거나, 타인의 데이터도 볼 수 있다.
- 레코드를 1행으로 특정할 수 있는 유니크(고유하고 식별 가능하고 중복이 발생하지 않는)한 정보(기본키) 필요.
- 기본키 값을 바꾸는 것은 좋지 않다. (데이터 정합성을 해칠 수 있다.)
- 변경 후 값의 유일성 보증이 어렵다.
- 과거 데이터와의 결합(매칭)이 어렵다.
- Null은 기본키 열이 될 수 없다.(기본키 열에 NULL 입력시 오류 발생)
- 데이터 관리는 등록한 시점뿐 아니라 장기적으로 정합성을 보증하도록 노력해야한다.설계시 데이터는 동적으로 생성,수정,삭제가 이뤄지는 동적임을 염두해야 한다.
- 한 개의 테이블 내용에는 중복 행을 허용하지 않는다.
- 테이블은 '어떤 공통의 속성을 가진 것의 집합'. 테이블명은 반드시 복수형 혹은 집합 명사.
- 테이블 설계 규칙
정규형: '데이터의 갱신이 발생한 경우에도 부정합이 발생하기 어려운 테이블의 형태'.
테이블 간에 중복된 데이터를 허용하지 않음으로 무결성을 유지하기 위한 형태로 데이터를 구조화하는 작업,
갱신이상의 위험을 없애는 것이 목적.*제1 정규형(1NF) : '테이블 셀에 복합적인 값(배열)을 포함하지 않는다.' 특정 열에 값만 배열이 들어가 한개 이상의 값을 가진 셀이 되는 경우
(ex - 회원 테이블의 피부양자 테이블에 다른 열은 한개의 스칼라값(단일값)을 가지고 문제 열만 (a,b)식의 문자 배열을 가진경우)스칼라 값(단일값) : 더이상 나누는 것이 불가능한 값
✔️ 제 1정규형 : 스칼라 값 이외의 값을 포함하지 않는 테이블(레코드 단일성 보증-데이터 정합성 관점)
복합적인 값을 허용하면?
- If 기본키일 경우 → 특정 행의 값을 고유하게 특정할 수 없으므로 기본키 정의에 반한다. (레코드 단일성 위배)
- 함수적 종속성 위배 →기본키와 다른 열 사이 함수적 유일성이자 종속성을 위배
→ 기본키와 특정 열사이의 관계가 기본적으로 1대 1 대응이지만, 복수열의 경우 1대 다 의 대응이되어 함수적 종속성이 위배된다. - 기본키가 아닌 속성들이 기본키에 완전 함수 종속되지 못하고 부분 함수 종속되어 있다.
제 2정규형(2NF) : 부분 함수 종속성을 없앤 것(기본키에 속하지 않는 속성 모두가 기본키에 완전 종속인 정규형) → 부분 함수 종속에 해당하는 키와 종속하는 열을 다른 테이블로 만들어 외부로 꺼낸다.(완전 함수 종속을 만족하도록 테이블 분해)
- 기본키를 구성하는 열의 일부에만 함수 종속이 존재하는 것을 제거하는 것
- 기본키의 부분집합으로 열을 특정 지을 수 없는 경우 발생
- EX 기업ID,주문 번호의 조합이 기본키인 주문 테이블에서 기업아이디로 기업정보를, 주문 번호로 주문 정보를 각각 특정지을수 있으나 기업ID로 주문 정보, 주문 번호로 기업정보가 중복되어 도출되므로 부분 함수 종속이 존재한다.
- 부분 기본키 값으로 인해 일부 정보가 NULL혹은 잘못된 정보로 갱신되는 갱신 이상으로 인한 데이터 부정합이 발생할수 있다.
- 기본키가 1개 열밖에 없는 테이블은 자동으로 제 2정규형 만족.
제 3정규형(3NF) : 추이 함수 종속(이행적 함수 종속성)을 없앤것(기본키 이외의 키간에 발생하는 함수 종속)
- 기본키에 속하지 않는 모든속성이 기본키에 이행적 함수 종속이 아닐때 제 3정규형이다.
- EX : 고객 기업 테이블 기본키가 기업ID 일때, 기본키가 아닌 COLUMN 업계코드,업계명이 속해있을다면 업계를 추가하기 위해서 고객기업을 추가해줘야하는 일이 발생 (추이함수종속 or 이행함수종속) → 업계테이블을 따로 외부로 뺀다.
- 기본키이외의 열에 데이터 갱신시 영향을 줄인다.
기본키(PK Primary Key)
외래키(FK Foreign Key) : 다른 테이블의 기본키 열을 참조하는 것-릴레이션십이 있다.
- 두 개의 테이블을 이어주는 연결 다리 역할
- 외래키가 있는 값을 갱신할때 외래키가 참조하는 테이블의 기본키 값을 같이 체크하여 데이터 무결성을 높여준다.(외래키 제약)
- 외래키의 모든 값은 참조하는 기본키와 동일 or NULL이다.