1. 무결성(Integrity)이란?
- 데이터가 정확하고, 일관되게 유지되는 성질. -> 즉 “데이터가 틀리지 않게 지키는 규칙”
- 예) 나이 -5살, 존재하지 않는 환자의 등록번화
| 개체 무결성 | 도메인 무결성 | 참조 무결성 | 사용자 정의 무결성 | NULL 무결성 | 고유 무결성 |
|---|
| 특징 | 각 행(레코드)이 고유하게 식별될 수 있도록 보장 | 열에 저장되는 데이터가 미리 정의된 도메인(값의 범위)에 속해야 함을 보장 | 테이블 간의 관계를 유지하는 무결성 | 사용자가 정의한 특정 규칙에 따라 데이터의 무결성을 보장 | 특정 열이 NULL 값을 가질 수 있는지 여부를 결정하는 무결성 | 특정 열 또는 열 집합이 중복된 값을 가질 수 없도록 보장 |
| 핵심 | PK는 중복❌, NULL❌ | 값 범위/형식 제한 | FK는 실제 값만 | 사용자가 만든 규칙 | NULL 허용 여부 | 중복 금지 (PK 제외도 가능) |
a. 개체 무결성 (Entity Integrity) = 엔티티 무결성
- 테이블의 각 행(레코드)이 고유하게 식별될 수 있도록 보장하는 무결성
- 기본 키(Primary Key)를 통해 구현
- 기본 키는 테이블 내에서 각 행을 고유하게 식별할 수 있는 값으로 NULL 값을 가질 수 없고(각 행이 고유하게 식별되도록 보장) 중복될 수 없다(동일한 값이 반복되지 않도록 보장)
b. 도메인 무결성 (Domain Integrity)
- 특정 열에 저장되는 데이터가 미리 정의된 도메인(값의 범위)에 속해야 함을 보장하는 무결성
- 데이터 형식, 값의 범위, 허용되는 값의 패턴 등이 입력되야 함. 즉 말이 되는 값들이 입력되야 한다는 느낌
- 주어진 속성이 정의된 도메인에 속해야 함
- ex) 나이 : 0~100 사이의 정수 값만 허용 -> -5세 입력, 성별 : 남/여 -> 없음 입력
c. 참조 무결성 (Referential Integrity)
- 테이블 간의 관계를 유지하는 무결성으로 외래 키(Foreign Key)를 통해 구현
- 외래 키는 항상 참조하는 기본 키와 일치해야 함
- 기존에 없는 것을 참조하면 안된다는 느낌
- 예) 환자ID가 PK에서 1의 키를 가졌는데, FK에서 2를 가지게 되면 안된다는 말
d. 사용자 정의 무결성 (User-Defined Integrity) = 비지니스 무결성
- 사용자가 정의한 특정 규칙에 따라 데이터의 무결성을 보장
- 이는 데이터베이스 내의 트리거, 저장 프로시저, 애플리케이션 로직 등을 통해 구현됨
- 속성 값들이 사용자가 정의한 제약 조건에 만족해야 함
- 예) 비밀번호 8자리, 20세 이상부터 가입 가능, 최소 주문금액
e. NULL 무결성 (NULL Integrity)
- 특정 열이 NULL 값을 가질 수 있는지 여부를 결정하는 무결성
- 데이터베이스에서 일부 열은 반드시 값을 가져야 하며 NULL 값을 허용하지 않는 제약 조건을 가질 수 있음
- 비어있어도 되는 항목인지 판단했을 때 정보가 꼭 필요한 경우 해당됨.
- 예) 회원가입 시 이름
f. 고유 무결성 (Unique Integrity)
- 특정 열 또는 열 집합이 중복된 값을 가질 수 없도록 보장
- 고유 키는 NULL 값을 가질 수 있다.
- 겹치면 안된다는 느낌
- ex) 이메일 주소는 고유해야 함
- 고유 키는 NULL 값을 가질 수 있음: 특정 열이 중복되지 않도록 보장
개체 무결성과 고유 무결성의 차이
두 무결성의 차이를 명확하게 구분하기 어려워서 더 자세히 알아봤다.
| 구분 | 개체 무결성 | 고유 무결성 |
|---|
| 핵심 질문 | 관리 대상이 누구인가? | 값이 겹쳐도 되는가? |
| 비유 | 환자라는 사람 그 자체 | 등록번호라는 겹치지 않는 성질 |
| DB 구조 | 테이블(table) | 제약 조건(constraint) |
| 파이썬 비교 | 리스트나 딕셔너리 전체 | 딕셔너리의 key가 중복 안되는 특징 |
💪 용어 정리
- 기본키(Primary Key, PK) : 중복될 수 없는 고유한 식별자로 테이블 내 딱 하나만 존재해야 하고 파이썬 리스트의 '인덱스'와 비슷함.
- 외래키 (Foreign Key, FK) : 다른 테이블을 참조하는 연결고리로 다른 테이블의 PK를 가져와 사용함.
* NULL : "값이 없음" 또는 "알 수 없음"으로 파이썬의 None과 유사함.
| 개념 | 비유 | 특징 |
|---|
| PK (기본키) | 주민등록번호 | 중복불가, 비어있을 수 없음 |
| FK (외래키) | 리모컨,연결고리 | 다른 테이블 가리킴, 테이블 간 관계 형성 |
| NULL | 빈칸(미정) | 데이터가 존재하지 않음을 나타냄 |
2. ⭐️정규화란?(제 1정규화, 제 2정규화, 제 3정규화)
정규화(Normalization)란?
- 데이터를 쪼개서 중복을 없애고 표를 깔끔하게 만드는 과정
- 즉, 데이터를 쪼개서 이상한 상황(중복, 오류)을 막는 것
- 유지보수에 용이
- Anomaly 현상을 막기 위해
Anomaly: 같은 데이터 반복 저장 (중복) ,하나 수정하면 여러 개 다 바꿔야 함, 삭제하면 필요한 정보도 같이 날아감
| 환자ID | 환자이름 | 전화번호 | 진료과 |
|---|
| P001 | 나환자 | 010 | 심장내과 |
| P002 | 나환자 | 010 | 호흡기내과 |
<발생 가능한 문제>
(1)환자 이름이 중복됨
(2)전화번호 바꾸면 여러 줄 수정해야 함
(3)만약 환자가 진료를 취소한다면 환자 정보도 사라짐
--> 이런 문제를 피하기 위해 필요한 것이 정규화
a. 제1정규화 (1NF)
- 한 칸에 값을 하나씩 넣으라는 의미. 다시 말해 표의 한 칸(셀)에 값이 여러 개 들어가지 않도록 --> 원자성 만족
- 중복되는 값이 있을 경우 분리해서 모든 칸에 값이 하나씩 들어가도록 만들기
- 예) '나환자' 환자의 진료과에 심장내과 호흡기내과를 한번에 입력하면 나중에 심장내과 진료만 받는 환자를 선별하기 어려워짐
b. 제2정규화 (2NF)
- 기본키의 일부분에만 의존하는 정보 제거", 부분 종속 제거
- 조건은 기본키가 여러 개인 복합키일 때만 해당됨.
- 예) [등록번호, 진료과, 진료실, 금액]이 기본키라고 했을 때 '진단명'은 '등록번호'와는 상관없고 '진단코드'와 관련이 높음(부분 함수 종속) -> [등록번호,진료실, 진료과], [진료과, 진료실]테이블로 추가
c. 제3정규화 (3NF)
-
컬럼끼리 의존하면 분리 즉, 간접관계 제거하기, 이행 종속 제거
-
기본키가 아닌 애들끼리 서로 의존하지 않게 한다고 생각하기
-
컬럼 관계를 찾는 것이 핵심, 컬럼이 다른 컬럼을 통해 간접적으로 종속되는 것 제거
-
기본키 → 컬럼 → 다른 컬럼 구조 제거
-
이행 함수 종속 (Transitive Dependency)
-
예) 고객테이블 : [ID, 진단명, 진단코드]들이 묶여 있다면 -> [ID, 진단명], [진단명, 진단코드]
제2정규화와 제3정규화 차이 명확히
👉 2NF = 부분 종속 제거 (PK 일부 문제)
👉 3NF = 이행 종속 제거 (컬럼 간 문제)