SQL Database Design


정규화 (Normalization)

정규화는 데이터베이스 설계에서 데이터의 중복을 줄이고, 데이터 무결성을 보장하기 위해 데이터 구조를 체계화하는 과정입니다. 정규화는 여러 단계로 나뉘며, 주로 1NF, 2NF, 3NF로 구분됩니다.

1NF (제1정규형, First Normal Form)

제1정규형은 데이터베이스 테이블의 각 열이 원자값(Atomic Value)만을 가지도록 하는 규칙입니다. 즉, 테이블의 각 열에는 단일 값을 저장해야 하며, 중복된 데이터나 반복 그룹이 없어야 합니다.

예제: 1NF 적용 전

주문ID고객명제품명
1김철수컴퓨터, 모니터
2이영희스마트폰, 키보드

위의 테이블은 제품명이 여러 개의 값을 포함하고 있으므로 1NF를 만족하지 않습니다.

예제: 1NF 적용 후

주문ID고객명제품명
1김철수컴퓨터
1김철수모니터
2이영희스마트폰
2이영희키보드

제품명이 각 행에 단일 값만 포함되도록 수정하여 1NF를 만족하게 합니다.

2NF (제2정규형, Second Normal Form)

제2정규형은 제1정규형을 만족하며, 모든 비주요 속성이 기본 키에 완전 함수 종속(Full Functional Dependency)되어야 함을 의미합니다. 즉, 기본 키의 일부가 아닌 모든 비주요 속성이 기본 키 전체에 의존해야 합니다.

예제: 2NF 적용 전

주문ID제품명고객명고객주소
1컴퓨터김철수서울시 강남구
1모니터김철수서울시 강남구
2스마트폰이영희부산시 해운대구

여기서 고객명고객주소주문ID제품명의 조합에 종속되지만, 주문ID에만 종속되어야 합니다. 따라서 고객명고객주소는 별도의 테이블로 분리해야 합니다.

예제: 2NF 적용 후

  • 주문 테이블 주문ID 제품명 1 컴퓨터 1 모니터 2 스마트폰
  • 고객 테이블 고객명 고객주소 김철수 서울시 강남구 이영희 부산시 해운대구

여기서 주문ID주문 테이블의 기본 키로, 고객명고객주소고객 테이블에 저장됩니다.

3NF (제3정규형, Third Normal Form)

제3정규형은 제2정규형을 만족하며, 모든 비주요 속성이 기본 키에 비이행적으로 종속(Transitive Dependency)되어야 함을 의미합니다. 즉, 비주요 속성이 기본 키가 아닌 다른 비주요 속성에 의존하지 않아야 합니다.

예제: 3NF 적용 전

주문ID제품명제조사제조사 주소
1컴퓨터삼성전자서울시 강남구
1모니터삼성전자서울시 강남구
2스마트폰LG전자경기도 성남시

여기서 제조사 주소제조사에 종속되며, 제조사제품명에 종속됩니다. 제조사 주소제조사에 종속되어 있으므로 3NF를 만족하지 않습니다.

예제: 3NF 적용 후

  • 주문 테이블 주문ID 제품명 제조사 1 컴퓨터 삼성전자 1 모니터 삼성전자 2 스마트폰 LG전자
  • 제조사 테이블 제조사 제조사 주소 삼성전자 서울시 강남구 LG전자 경기도 성남시

여기서 제조사제조사 주소는 별도의 테이블로 분리되어 비이행적 종속성을 만족합니다.

역정규화 (Denormalization)

역정규화는 정규화된 데이터베이스 설계를 일부러 비정규화하여 성능을 개선하거나 복잡한 쿼리의 성능을 최적화하는 과정입니다. 데이터의 중복을 허용하고 조인을 줄이는 대신, 데이터 무결성 문제를 유발할 수 있습니다.

예제: 역정규화 적용

  • 원본 테이블 주문ID 고객명 제품명 1 김철수 컴퓨터 1 김철수 모니터 2 이영희 스마트폰
  • 역정규화 테이블 주문ID 고객명 제품명 고객주소 1 김철수 컴퓨터, 모니터 서울시 강남구 2 이영희 스마트폰 부산시 해운대구

여기서 제품명고객주소가 중복될 수 있지만, 쿼리 성능이 향상될 수 있습니다.

데이터베이스 설계 원칙 (Database Design Principles)

데이터베이스 설계 원칙은 데이터베이스의 구조와 무결성을 유지하면서 효율적이고 확장 가능한 시스템을 구축하는 데 도움을 주는 지침입니다.

1. 데이터 무결성 (Data Integrity)

데이터 무결성은 데이터베이스의 데이터가 정확하고 일관되며 신뢰할 수 있도록 보장하는 원칙입니다. 이를 위해 기본 키, 외래 키, 제약 조건 등을 활용합니다.

예제: 기본 키와 외래 키

-- 기본 키 제약 조건 추가
ALTER TABLE Orders
ADD CONSTRAINT PK_OrderID PRIMARY KEY (OrderID);

-- 외래 키 제약 조건 추가
ALTER TABLE Orders
ADD CONSTRAINT FK_CustomerID FOREIGN KEY (CustomerID)
REFERENCES Customers (CustomerID);

2. 정규화와 성능의 균형 (Balance Between Normalization and Performance)

정규화는 데이터 중복을 줄이고 무결성을 보장하지만, 지나친 정규화는 성능 저하를 초래할 수 있습니다. 따라서 정규화와 성능 사이의 균형을 유지하는 것이 중요합니다.

3. 확장성과 유지 보수성 (Scalability and Maintainability)

데이터베이스 설계는 시스템이 성장하고 변경되더라도 쉽게 확장 가능하고 유지보수할 수 있도록 설계해야 합니다. 이는 구조가 명확하고, 데이터베이스의 변경이 시스템에 최소한의 영향을 미치도록 합니다.

예제: 유지 보수성을 고려한 설계

-- 새로운 열 추가
ALTER TABLE Employees
ADD DateOfBirth DATE;

이 쿼리는 Employees 테이블에 DateOfBirth 열을 추가하여 직원의 생일 정보를 저장할 수 있게 합니다.

4. 보안 고려 (Security Considerations)

데이터베이스 설계 시 보안을 고려하여 권한 부여, 데이터 암호화 및 접근 제어를 설정해야 합니다. 데이터베이스의 중요 데이터는 암호화하여 무단 접근으로부터 보호합니다.

예제: 데이터 암호화

-- 암호화된 데이터 삽입
INSERT INTO SensitiveData (Data) 
VALUES (EncryptByPassPhrase('YourPassPhrase', 'SensitiveDataValue'));

이 쿼리는 데이터가 암호화되어 저장되도록 합니다.

결론 (Conclusion)

데이터베이스 설계는 데이터 무결성을 유지하고 성능을 최적화하며 확장성과 유지보수성을 고려하는 복합적인 과정입니다. 정규화는 데이터 중복을 줄이고 무결성을 보장하는 데 중요하며, 역정규화는 성능 개선을 위한 전략입니다. 설계 원칙을 고려하여 데이터를 효율적으로 관리하고 시스템의 보안을 강화하는 것이 중요합니다.


Leave a Reply

Your email address will not be published. Required fields are marked *