Written by
Poogle
on
on
DB 면접 질문 모음
해당 포스팅은 DB 기술 면접 질문들을 정리합니다. 아래 링크들을 토대로 내용을 보충했습니다.
참고 링크
[실무 면접 준비 - 3] 데이터베이스 & 네트워크 (Database & Network)
📌 DB 기본
❓ 데이터베이스란?
- 데이터베이스란 여러 사람이 공유하여 사용할 목적으로 통합되어 관리되는 데이터의 집합을 의미합니다.
DBMS(DataBase Management System)
: 데이터베이스를 관리하는 시스템
❓ 데이터베이스의 특징?
- 독립성(Independence)
- 데이터베이스는 데이터를 사용하는 응용 프로그램과 독립적으로 데이터를 저장하고 관리합니다.
물리적 독립성
: 데이터베이스 사이즈를 늘리거나 성능 향상을 위해 데이터 파일을 새롭게 추가하더라도 관련된 응용 프로그램을 수정할 필요가 없습니다.논리적 독립성
: 데이터베이스는 논리적인 구조로 다양한 응용 프로그램의 논리적 요구를 만족시켜줄 수 있습니다.
- 무결성(Integrity)
- 데이터베이스는 다양한 제약조건 및 기능을 통해 데이터의 무결성을 유지합니다.
- 보안성(Security)
- 데이터베이스는 계정 및 권한 관리(인가된 사용자만 자원에 접근)를 통해 데이터들의 보안을 유지합니다.
- 일관성(Consistency)
- 데이터베이스는 다양한 제약조건을 통해 데이터를 일관되게 유지합니다.
- 어떤 하나의 데이터만 변경했을 경우 발생할 수 있는 데이터의 불일치성을 배제할 수 있고, 작업 중 일부 데이터만 변경되어 나머지 데이터와 일치하지 않는 경우의 수를 배제할 수 있습니다.
- 중복 최소화(Minimum Duplication)
- 데이터베이스는 데이터를 통합해서 관리함으로써 데이터의 중복을 최소화합니다.
❓ 데이터 무결성이란?
- 데이터에 결함이 없는 상태, 데이터를 정확하고 유효하게 유지하는 것을 말합니다.
- 데이터의 정확성과 일관성을 유지하고 보증하기 위해 데이터베이스에 삽입, 삭제, 수정, 연산이 일어나도 무결성 제약조건은 지켜져야 합니다.
❓ 무결성 제한의 유형은?
- 개체 무결성(Entity Integrity)
- 모든 테이블은 기본 키(primary key)를 가져야 하며 기본 키로 선택된 열은 고유하고 빈 값은 허용되지 않습니다.
- 기본키는 null이 될 수 없습니다.
- 참조 무결성(Referential Integrity)
- 모든 외래 키 값은 Null이거나 참조 릴레이션의 기본키 값과 동일해야 합니다.
- 릴레이션은 참조할 수 없는 외래키 값을 가질 수 없습니다.
- 범위(도메인) 무결성(Domain Integrity)
- 정의된 범위에서 관계형 데이터베이스의 모든 열이 선언되어야 합니다.
- 키 무결성(Key Integrity)
- 릴레이션에는 최소한 하나의 키가 존재해야 합니다.
- null 무결성(Null Integrity)
- 특정 속성은 null 값을 가질 수 없습니다.
- ex. 유저 아이디와 같은 중요한 정보는 스키마를 정의할 때 null을 가질 수 없도록 미리 정의합니다.
- 고유 무결성(Unique Integrity)
- 특정 속성값은 서로 달라야 합니다.(고유한 값을 가져야 함)
- 각 튜플에서 하나의 속성값은 중복된 값이 없는 각각 서로 다른 값을 가져야 합니다.
- ex. 이름, 나이, 사는 곳과 같은 속성은 서로 같은 값을 가질 수 있지만 고객 아이디의 경우 서로 다른 값을 가져야 합니다.
❓ Key란?
- 검색, 정렬 시 튜플(레코드, 행)을 구분할 수 있는 기준이 되는 속성을 말합니다.
- 후보키(Candidate Key)
- 기본키로 사용할 수 있는 속성들(유일성, 최소성)을 말합니다.
- 후보키 중 기본키를 제외한 나머지는 모두 보조키가 됩니다.
- 유일성 O, 최소성 X -> 슈퍼키
- 기본키(Primary Key)
- 하나의 테이블에서 특정 튜플을 구별할 수 있는 속성(Attribute)을 의미합니다.
개체 무결성
에 의해 기본키에는 null 값과 중복된 값이 저장되어질 수 없습니다.- 엔티티를 식별하는 대표 키가 됩니다.
- table 당 1개만 지정합니다.
- 외래키(Foreign Key)
- 참조되는 테이블의 기본키와 대응되어 테이블 간에 참조 관계를 표시하는 키입니다.
- 외래키로 지정되면 참조 무결성에 의해 참조 테이블의 기본키에 없는 값은 입력할 수 없습니다.
- 두 테이블 간의 종속이 필요한 관계이면 그 접점이 되는 칼럼을 FK로 지정하여 서로 참조할 수 있도록 관계를 맺어줍니다.
- 테이블 간의 잘못된 매핑을 방지하는 역할을 합니다.
❓ 외래키는 NULL이 허용되는가?
- 허용됨 (ex. 사원은 하나의 부서를 가짐 / 신입사원은 부서가 미정일 수 있음)
1) 외래키 값은 NULL
이거나 부모 테이블의 기본키 값과 동일해야 합니다. (참조 무결성 제약조건)
2) 부모 테이블의 기본키, 고유키를 외래키로 지정할 수 있습니다.
3) 부모 테이블의 기본키, 고유키가 여러 개의 컬럼으로 이루어져 있다면 부모가 가진 기본키, 고유키 컬럼을 원하는 개수만큼 묶어서 외래키로 지정할 수 있습니다.
4) 외래키로 지정할 두 테이블의 필드는 같은 데이터 타입이어야 합니다.
📌 RDBMS & NoSQL
❓ RDBMS vs NoSQL?
- 둘은 대체될 수 있는 것이 아니고, 각각 필요한 시점에 적절히 선택해서 사용해야 합니다.
- 둘 다 같이 쓰는 상호보완적인 존재가 될 수도 있습니다.
RDBMS
- 데이터베이스를 이루는 객체들의 릴레이션을 통해서 데이터를 저장하는 데이터베이스입니다.
- 🤔 언제 사용 하나요?
- 관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션의 경우(NoSQL에서는 여러 컬렉션을 모두 수정해야 하기 때문에 비효율적)에 사용됩니다.
- 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우에 사용됩니다.
- SQL을 사용해 데이터의 저장, 질의, 수정, 삭제를 할 수 있으며 데이터를 효율적으로 보관하는 것을 목적으로 하고 구조화가 굉장히 중요합니다.
- 명확한 데이터 구조를 보장하고, 중복을 피할 수 있습니다.
- 데이터는 정해진 데이터 스키마에 따라 테이블에 저장합니다.
- 데이터는 관계를 통해 여러 테이블에 분산됩니다.
NoSQL
- 전통적인 관계형 모델에서 벗어나서 다양한 데이터 모델을 사용하여 데이터의 관리와 접근을 지원하는 데이터베이스를 의미합니다.
- 🤔 언제 사용 하나요?
- 정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우에 사용됩니다.
- 읽기를 자주 하지만, 데이터 변경은 자주 없는 경우에 사용됩니다.
- 데이터베이스를 수평으로 확장해야 하는 경우 (막대한 양의 데이터를 다뤄야 하는 경우)에 사용됩니다.
- NoSQL은 RDBMS에 비해 자유로운 형태로 데이터를 저장합니다.
- 수평확장을 할 수 있고 분산처리를 지원합니다.
- 👍 장점
- 스키마가 없거나 느슨하게 제공되기 때문에 요구사항 변경에 유연하게 대처할 수 있습니다.
- 관계형 데이터베이스에 비해 수평 확장이 쉽기 때문에 대용량 데이터 처리 시 성능상의 이점이 있습니다.
- 👎 단점
- 데이터베이스마다 사용하는 데이터의 모델이 다르기 때문에 이를 도입하기 위해서는 해당 데이터베이스를 잘 알아야 합니다.
- SQL처럼 엄격한 제약조건이 존재하지 않기 때문에 데이터를 수정하거나 삭제하는 경우 모든 컬렉션에 걸쳐서 이를 반영해야 하는 단점이 존재합니다.
- 데이터 모델에 따라 분류
- Key-Value Data Model: 하나의 키에 하나의 데이터 저장 -> ex. Redis, Memcached, Redis, DynamoDB
- Document Data Model: Key-Value 모델을 개념적으로 확장해서 하나의 키에 하나의 구조화된 문서를 저장 -> ex. MongoDB
- Column-Family: Cassandra
- Graph Model
❓ RDBMS의 한계와 NoSQL을 사용하는 이유 - CAP, PACELC 이론
CAP 이론
: 분산 환경에서 모두를 만족하는 시스템은 없다는 이론입니다.- Consistency(일관성)
- 모든 노드들이 동일 시간에 동일 데이터를 사용자에게 보여줘야 하는 것을 의미합니다.
- ACID Consistency와는 조금 다릅니다. (데이터는 항상 일관성 있는 상태를 유지, 데이터 조작 후에도 헤치지 말아야 한다는 속성)
- 쓰기 동작 완료 후 발생하는 읽기 동작은 마지막으로 쓰여진 데이터를 리턴합니다.
- 동시성, 동일성이라고도 하며 다중 클라이언트 환경에서 같은 시간에 조회하는 데이터는 항상 동일해야 한다는 보증을 하는 것입니다.
- RDBMS가 지원하는 가장 기본적인 기능입니다.
- NoSQL은 데이터의 일관성이 느슨하게 처리(데이터의 변경이 시간에 흐름에 따라 여러 노드에 전파)되어 동일한 데이터가 나타나지 않을 수 있습니다.
- Availability(가용성)
- 특정 노드에 장애가 발생해도 성공적으로 서비스를 지속하는 것을 의미합니다.
- 모든 동작에 대한 응답이 리턴되어야 합니다.
- Partition Tolerance(분할 내성)
- 시스템 일부가 네트워크에서 연결이 끊기더라도 동작해야 하는 것을 의미합니다.
- 파티션 허용, 분산화 가능 물리적인 네트워크 분산 환경에서도 시스템이 잘 동작해야 하는 것을 의미합니다.
- 분산 시스템에서 2가지만 만족할 수 있는데 단순히 특정 데이터베이스가 CA, CP, AP라고 확정지을 수는 없습니다. => 어떻게 클러스터링 하느냐에 따라 달라질 수 있음
- RDBMS는 일반적으로 CA를 만족하는데 분산화보다는 데이터의 일관성과 가용성에 중점을 주기 때문, 시스템의 신뢰성이 높습니다.
- NoSQL은 일반적으로 CP(MongoDB, Redis)나 AP(DynamoDB, cassandra, CouchDB)형태를 선호하는데 데이터의 신뢰성보다는 분산에 중점을 둔 방식이기 때문입니다.
- ⚠️ 한계
- 완벽한 AP, CP 시스템은 사용할 수 없고 대부분의 분산 시스템은 CP와 AP의 중간이 됩니다.
- 모든 분산 시스템이 파티션을 사용하지는 않습니다.
PACELC 이론
: CAP로 부족한 부분을 보완하기 위해 네트워크 장애 상황(Partition)과 정상 상황(Else)을 나눠서 설명하는 이론입니다.- 네트워크 장애 상황 시 분산시스템은 가용성(A;Availability)과 일관성(C;Consistency)이 상충됩니다.
-
정상 상황 시 지연 시간(L; Latency)과 일관성(C; Consistency)이 상충됩니다.
- cf.) Eventual Consistency: Consistency를 보장해주지 못하기 때문에 나온 개념으로, Consistency를 완전히 보장하지는 않지만, 결과적으로 언젠가는 Conssistency가 보장됨을 의미합니다.
📌 Example - DB
MySQL
❓ MySQL 버젼 5.7 vs 8.0 차이점?
- 사용자 인증방식 변경
- 외래키 이름의 길이(64bit)
- InnoDB
- Auto_Increment의 초기화 방식 변화
- NOWAIT and SKIP LOCKED (MySQL 8.0이 Hot rows를 처리하는 방법)
- 데이터 딕셔너리 업그레이드
- MySQL 5.7 버전까지는 데이터 딕셔너리 정보가 FRM 확장자를 가진 파일로 별도로 보관
- MySQL 8.0 버전부터는 데이터 딕셔너리 정보가 트랜잭션이 지원되는 InnoDB 테이블로 저장되도록 개선
- 데이터 딕셔너리 업그레이드는 기존의 FRM 파일의 내용을 InnoDB 시스템 테이블로 저장
- MySQL 8.0 버전부터는 딕셔너리 데이터의 버전 간 호환성 관리를 위해 테이블이 생성될 때 사용된 MySQL 서버의 버전 정보도 함께 기록
- SQL DDL
- SQL DML
- Windows Functions
- CTE (Common Tables Expressions)
- Indexes
- Descending Indexes
- Invisible Indexes
- Functional Indexes
- JSON
- GROUP BY에 사용된 정렬 옵션
- 파티션을 위한 공용 테이블 스페이스
- 서버 업그레이드
- MySQL 서버의 시스템 데이터베이스(performance_schema, information_schema, mysql 데이터베이스)의 테이블 구조를 MySQL 8.0 버전에 맞게 변경
❓ Redis란?
- key-value store NoSQL DB
- 싱글스레드로 동작하며 자료구조를 지원
- 보통 DB는 하드디스크나 SSD에 저장히는데 반해 Redis는 메모리(RAM)에 저장해서 디스크 스캐닝이 필요없는 장점이 있음
- 백업과정: 데이터의 스냅샷(특정 지점을 설정하고 디스크에 백업) 혹은 AOF(Append Only File; 명령(쿼리)들을 저장해놓고 서버가 셧다운되면 재실행) 로그를 통해 복구가 가능해서 어느 정도 영속성도 보장
- 스프링에서는 세션을 관리하거나, 캐싱을 하는데에 자주 사용(실시간 채팅에 적합)
❓ Redis와 Memcached의 차이는?
- Redis는 싱글 스레드 기반으로 동작 / Memcached는 멀티스레드를 지원해서 멀티 프로세싱이 가능합니다.
- Redis는 다양한 자료구조를 지원 / Memcached는 문자열 형태로만 저장
- Redis는 여러 용도로 사용할 수 있도록 다양한 기능을 지원
- Redis는 스냅샷, AOF 로그를 통해서 데이터 복구가 가능합니다.
Join
조인이란 2개 이상의 테이블에서 조건에 맞는 데이터를 추출하기 위하여 사용하는 쿼리문을 의미
- Inner Join: 2개 이상의 테이블에서 교집합만을 추출
- Left Join: 2개 이상의 테이블에서 FROM문에 해당하는 부분을 추출
- Right Join: 2개 이상의 테이블에서 FROM 문의 테이블과 JOIN하는 테이블에 해당하는 부분을 추출
- Outer Join: 2개 이상의 테이블에서 모든 테이블에 해당하는 부분을 추출
UNION vs UNION ALL
- UNION과 UNION ALL 모두 여러개의 SQL문을 합쳐 하나의 SQL문을 만들어 줌
- UNION
- 두 쿼리의 결과 중에서 중복되는 값을 삭제하여 나타냄
- UNION ALL
- 두 쿼리의 결과 중에서 중복되는 값을 모두 보여줌
- 중복체크를 하지 않기 때문에 속도가 더 빠름
- UNION
Index
❓ 데이터베이스에서 인덱스를 사용하는 이유 및 장단점에 대해 설명해주세요.
- 데이터베이스에서 인덱스를 사용하는 이유는 검색성능을 향상시키기 위함
- 데이터베이스 인덱스란 테이블의 동작 속도(Row 검색 속도)를 높여주는 자료구조를 의미 (ex. 책의 앞 부분에 존재하는 목차)
- 데이터베이스는 인덱스를 따로 저장하며 관계형 DB의 경우에는 테이블로 인덱스를 관리
- 장점
- 빠른 검색 성능
- 단점
- 인덱스를 구성하는 비용 즉, 추가, 수정, 삭제 연산시에 인덱스를 형성하기 위한 추가적인 연산이 수행
사용하면 좋은 경우
(1) Where 절에서 자주 사용되는 Column
(2) 외래키가 사용되는 Column
(3) Join에 자주 사용되는 Column
Index 사용을 피해야 하는 경우
(1) Data 중복도가 높은 Column
(2) DML이 자주 일어나는 Column
DML이 일어났을 때의 상황
- INSERT: 기존 Block에 여유가 없을 때, 새로운 Data가 입력
- 새로운 Block을 할당 받은 후, Key를 옮기는 작업을 수행한다.
- Index split 작업 동안, 해당 Block의 Key 값에 대해서 DML이 블로킹 된다. (대기 이벤트 발생)
- DELETE
- Table에서 data가 delete 되는 경우 : Data가 지워지고, 다른 Data가 그 공간을 사용 가능하다.
- Index에서 Data가 delete 되는 경우 : Data가 지워지지 않고, 사용 안 됨 표시만 해둔다.
- Table의 Data 수와 Index의 Data 수가 다를 수 있음
- UPDATE
- Table에서 update가 발생하면 → Index는 Update 할 수 없다.
- Index에서는 Delete가 발생한 후, 새로운 작업의 Insert 작업 / 2배의 작업이 소요되어 힘들다.
❓ 인덱스를 구현하기 위한 자료구조는 어떤 것들이 존재하나요?
Hash Table
- Key와 Value로 데이터를 저장하는 자료구조
- 빠른 데이터 검색이 필요할 때 유용
- 시간복잡도: O(1)
- Key값을 이용해 고유한 Index를 생성하여 그 Index에 저장된 값을 꺼내오는 구조
- 등호(=) 연산에만 특화되어 있기 때문에 부등호 연산(>, <)이 자주 사용되는 데이터베이스 검색을 위해서는 적절하지 않음
- key-value 기반의 DB인 Redis에는 적절
B+ Tree
- DB의 인덱스를 위해 자식 노드가 2개 이상인 Binary Tree를 개선시킨 자료구조
- Leaf 노드(데이터 노드)만 인덱스와 함께 데이터(Value)를 가지고 있고, 나머지 노드(인덱스 노드)들은 데이터를 위한 인덱스(key)만을 가짐, Leaf 노드들은 LinkedList로 연결
- B+Tree의 리프노드들은 LinkedList로 연결하여 순차검색을 용이하게 하는 등 인덱스에 맞게 최적화
[PostgreSQL] GIN(Generalized Inverted Index)
- GIN 자료구조는 인덱스를 적용하는 컬럼의 값을 일정한 규칙에 따라 쪼개고 이를 사용하는 자료구조
- 즉, LIKE와 같은 연산이 많을 경우 B+ Tree나 Hash Table 인덱스보다 훨씬 빠르게 동작
❓ 인덱스를 고려할 때 어떠한 점에 주의해야 하나요?
- 인덱스를 설정할 때 해당 테이블에서 어떠한 쿼리가 자주 사용되는지 분석
- ex. SELECT가 자주 사용되는 테이블 -> 인덱스 설정시 성능 향상의 효과를 기대할 수 있음
- ⚠️ UPDATE, DELETE, INSERT 쿼리가 자주 사용되는 테이블 -> 오히려 인덱스 설정시 성능이 감소될 수 있음
- 인덱스 설정시 카디널리티(Cardinaity; 전체 행에 대한 특정 컬럼의 중복 수치, 툭정 데이터 집합의 unique한 값의 개수)가 많이 없는 컬럼을 인덱스로 걸어야 함
- 카디널리티가 낮은 컬럼을 인덱스로 사용 => 인덱스를 통해서 수 많은 row가 검색 -> 다시 Full Search로써 결과값을 검색해야 함
- 카디널리티가 높은 컬럼을 인덱스로 사용 => 인덱스를 통해서 소수의 row만 검색 -> 이들 중 조건에 맞는 row만 반환하면 되기 때문에 성능이 훨씬 좋음
Transaction
❓ 트랜잭션에 대해서 설명해주세요.
- 트랜잭션이란 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미
- 트랜잭션은 수행 중에 한 작업이라도 실패하면 전부 실패하고, 모두 성공해야 성공이라고 할 수 있음
❓ 트랜잭션의 특징은 무엇인가요? - ACID
- ACID: 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질
- Atomicity(원자성): 트랜잭션의 연산은 모든 연산이 완벽히 수행되어야 하며, 한 연산이라도 실패하면 트랜잭션은 실패함, 트랜잭션의 연산이 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야 한다는 것을 의미
- Consistency(일관성): 트랜잭션은 유효한 상태로만 변경, 트랜잭션이 수행된 이후에도 데이터베이스는 언제나 일관성 있는 데이터를 보장해야 한다는 것을 의미
- Isolation(고립성): 트랜잭션은 동시에 실행될 경우 다른 트랜잭션에 의해 영향을 받지 않고 독립적으로 실행
- Durability(내구성): 트랜잭션이 커밋된 이후에는 시스템 오류가 발생하더라도 커밋된 상태로 유지되는 것을 보장 (일반적으로 비휘발성 메모리에 데이터가 저장되는 것을 의미)
❓ 트랜잭션은 어떻게 동작하나요?
(1) 트랜잭션 시작
(2) 작업 수행
(3-1) 모든 작업을 이상 없이 완료 -> 해당 트랜잭션을 Commit
(3-2). 작업 진행 중 실패 시 -> 해당 트랜잭션을 Rollback or Abort
❓ 트랜잭션 격리 수준(Transaction Isolation Levels)에 대해서 설명해주세요.
트랜잭션 격리수준은 고립도와 성능의 트레이드 오프를 조절합니다.
READ UNCOMMITTED
: 다른 트랜잭션에서 커밋되지 않은 내용도 참조할 수 있음READ COMMITTED
: 다른 트랜잭션에서 커밋된 내용만 참조할 수 있음REPEATABLE READ
: 트랜잭션에 진입하기 이전에 커밋된 내용만 참조할 수 있음SERIALIZABLE
: 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 함(성능 매우 떨어짐)
❓ SQL Injection이란?
- 조작된 SQL 쿼리문이 DB에 직접 전달되어 비정상적인 명령을 실행시키는 공격 기법
공격 방법
- 인증 우회
- 로그인과 같은 요청에서 보안 취약성을 이용해 DB에 영향을 줄 수 있는 다른 쿼리문을 함께 전송
- 기본 쿼리문에
WHERE ~ OR '1' = '1'
등과 같이 무조건 실행되는 true문 작성해 조작
- 데이터 노출
- 에러 메시지 역이용해 데이터베이스 구조를 유추한 후 해킹에 활용
방어 방법
- input값 유효성 검사 -> 특수문자 여부 검사
- SQL과 관련한 서버 에러 메시지 노출하지 않도록 함
- preparestatement 사용: 특수문자 자동 escape -> 서버 필터링
정규화(Normalization)
❓ 정규화는 무엇이며 왜 필요한가요?
- 정규화는 데이터의 중복방지, 무결성을 충족시키기 위해 데이터베이스를 설계하는 것을 의미
- 정규화란 데이터베이스에서 갱신 이상을 없애고 데이터의 중복을 최소화하기 위해 하나의 테이블을 둘 이상의 테이블로 분리하는 작업을 의미
- 갱신 이상에는 삽입 이상, 삭제 이상, 수정 이상 등이 포함
❓ 갱신 이상
- 삽입 이상(Insertion Anomalies): 원하지 않는 자료가 삽입된다든지, 삽입하는데 자료가 부족해 삽입이 되지 않아 발생하는 이상을 의미
- 삭제 이상(Deletion Anomalies): 하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로써 원하지 않는 정보의 손실이 발생하는 이상을 의미
- 수정 이상(Modification Anomalies): 데이터 수정시 일부의 튜플만 갱신되어 데이터의 일관성에 이상이 생기는 현상을 의미
❓ 정규형이란 무엇이고 이들의 종류에 대해서 설명해주실 수 있나요?
정규형이란 특정 조건을 만족하는 테이블의 스키마 형태를 말하며 제 1 정규형, 제 2 정규형, 제 3 정규형, BCNF 정규형 등이 존재
- 제 1 정규형: 테이블의 각 로우에 컬럼의 값이 1개만 있어야 하는 형태의 테이블 스키마를 의미합니다.
- 제 2 정규형: 제 1 정규형을 만족하면서 Primary Key가 합성키이며, 부분 종속(Primary Key 중에 특정 컬럼에만 종속된 컬럼)이 없어야 하는 형태의 테이블 스키마를 의미합니다.
- 제 3 정규형: 제 2 정규형을 만족하면서 테이블 내의 비주요 속성이 기본 키에만 의존하는 테이블 스키마를 의미합니다.
- BCNF 정규형: 제 3 정규형을 만족하면서 모든 결정자가 후보키 집합에 속한 테이블 스키마를 의미합니다.
❓ 함수적 종속성(Functional Dependency)
- 속성 값의 의미와 속성 간의 상호 관계로부터 유도되는 제약조건의 일종을 의미
- X와 Y를 임의의 속성 집합이라고 할 때, X의 값이 Y의 값을 유일하게(unique) 결정한다면 “X는 Y를 함수적으로 결정한다”라고 함