데이터베이스 정규화와 성능 최적화 전략

2024. 7. 4. 18:02·Computer Science

 

 최근에 컴퓨터, 인터넷 기술이 발달하면서 처리해야 하는 정보들이 급증하고 있습니다. 우리가 인터넷으로 하는 대부분의 사이트들은 효율적으로 정보를 저장하고 관리하는데 큰 노력을 기울이고 있습니다. 이러한 상황에서 등장한 데이터베이스는 그 어느 때보다 중요해졌습니다. 방대한 양의 데이터를 체계적으로 관리하고 접근할 수 있도록 해주기 때문에 우리는 데이터베이스에 대해 더욱 깊이 공부하고 끊임없이 발전해나가야 합니다.

 

 

 현재 우리는 데이터베이스를 사용해서 정보를 저장하고 있지만, 정보화 시대인 만큼, 우리는 앞으로 더욱 늘어날 데이터들을 더 체계적으로 관리해야 합니다. 이번에는 데이터베이스를 관리할 때, 어떻게 더 효율적으로 구축해야 하는지에 대해 알아보겠습니다.

 

 


 

목차

 

1. 데이터베이스 구조
2. 정규화
3. 성능 최적화
4. 분석

 

 


 

#1 데이터베이스 구조

 

 아마 이 글을 보시는 분들은 데이터베이스에 대한 기초적인 지식들은 숙지하고 계실 것이라고 생각을 합니다. 그러나, 더욱 깊은 이해를 위해 간단하게 데이터베이스 구조에 대해 알려드리겠습니다.

<그림 1> 데이터베이스 구조

 

 데이터베이스 구조는 위와 같이 상자형 구조입니다 ! 위의 예시를 간단히 설명해 드리자면, EMPLOYEE, EMP_DATA라는 이름을 가진 테이블(Table)과 각 테이블의 속성(Attribution)들이 적혀있습니다. 속성 옆에 적힌 것들은 튜플(Tuple)의 형식을 의미하고, NUMBER과 VARCHAR 이라고 적혀있어요. 이러한 형태로 우리가 정보 집합체를 정의하고 서로 연결을 하면서 관리를 할 수 있습니다.

 

 우리가 여기서 알아야할 것은 두 테이블이 참조 관계라는 것입니다! 테이블이 서로 연결되어 있는 것을 알 수 있죠? EMPLOYEE 테이블에서는 ID가 주식별자이자 기본키, EMP_DATA 테이블에서는 EMP_ID가 주식별자이자 외래키인 것을 알 수 있어요. 여기서 기본키란 간단히 말해 참조를 받는 속성을 의미하고, 외래키란 참조를 하는 속성이라고 할 수 있습니다. 따라서 둘은 기본키와 외래키가 모두 주식별자이기 때문에 식별자 관계입니다 !

 

 이제, 두 테이블의 구성요소와 관계를 알았으니 데이터베이스를 조회하는 것에 대해 알아보겠습니다.

SELECT * --모든 칼럼을 출력함.
FROM EMPLOYEE --EMPLOYEE 테이블에서 가져옴.
;

SELECT * --모든 칼럼을 출력함.
FROM EMP_DATA --EMP_DATA 테이블에서 가져옴.
;

 

SELECT 문을 통해 테이블 안에 존재하는 모든 속성(=칼럼)과 인스턴스(=튜플)를 출력할 수 있습니다 !

이러한 방식으로 우리가 원하는 정보를 데이터베이스 파일에서 조회가 가능합니다. 그렇다면 데이터베이스에 값을 추가하거나 삭제, 입력할 때에는 어떻게 해야 할까요?

 

 

INSERT INTO EMPLOYEE (ID, F_NAME, L_NAME, SALARY, ADDRESS_ID) --EMPLOYEE 테이블에 행을 추가함.
VALUES (123, 'abc', 'ABC', 7200, 1234) --튜플을 추가함.
;

DELETE FROM EMPLOYEE --EMPLOYEE 테이블에서 가져옴.
WHERE ID = 123 --ID가 123인 튜플을 삭제함.
;

UPDATE EMPLOYEE --EMPLOYEE 테이블에서 가져옴.
SET SALARY = 7600 --연봉을 7600으로 수정함.
WHERE ID = 123 --ID가 123인 튜플을 수정함.
;

 

 위처럼 각각 INSERT INTO ~ VALUES, DELETE, UPDATE ~ SET 구문을 사용하면 됩니다. 이러한 문법을 통해 쉽고 편리하게 데이터베이스를 관리하고 작업을 할 수 있어요 ! 어린 학생들도 누구나 쉽게 데이터베이스를 관리하고 사용할 수 있습니다 :)

 

 그러나, 실무에서 사용되는 데이터베이스의 저장되는 데이터의 수는 정말 수백 개, 수천 개, 심지어는 수백만 개까지 존재할 수 있습니다. 우리가 저런 간단한 명령으로 데이터베이스를 사용할 수 있지만, 컴퓨터의 속도는 한계가 있기 때문에 정말 비효율적으로 시간이 소요되거나 메모리가 낭비되는 문제점이 발생할 수 있습니다. 아래에는 실무에서 발생할 수 있는 데이터베이스의 시나리오들입니다.

 

 

  • 중복 : 똑같은 정보가 중복됨.
  • 비유연성 : 사소한 업무 변화에도 데이터를 바꿔야 함.
  • 비일관성 : 데이터 변경을 할 때 프로세스가 누락될 수 있음.

 

 첫 번째로, 중복성이 있습니다. 예를 들어, 직원 한 명이 전화번호가 2개라고 가정을 한다면, 인스턴스(행)가 한 줄이 증가하게 됩니다. 인스턴스에는 단 하나의 값만 존재해야 하기 때문에 두 줄로 분리를 해야 합니다. 이로 인해, 직원 한 명의 정보가 두 줄의 튜플로 저장이 되고, 전화번호 이외의 데이터들은 중복이 됩니다. (ex. 부서코드, 연봉 등)

 

 두 번째로는, 비유연성입니다. 우리가 실무에서는 데이터 값을 변경해야 하는 경우가 여럿 존재합니다. 예를 들어, 고객의 주소나 연락처, 연봉 등이 하나의 테이블에 모두 저장되어 있을 때, 새로운 칼럼을 추가한 거나 수정을 한다면, 테이블 전체를 수정해야 하는 상황이 발생합니다. (ex. 강의명을 바꾼다면 교수명도 바꿔야 함)

 

 마지막으로, 비일관성입니다. 우리가 실무에서 작업을 할 때, 동시에 데이터를 업데이트를 하려고 하면, 너무 복잡한 구조로 인해 부주의하게 잘못된 데이터가 저장될 수 있습니다. (ex. 재고와 실제 수량의 차이 발생)

 

 

 그렇다면 이러한 문제들은 어떻게 처리를 해야 하는 걸까요? 그것이 바로 필수적으로 진행해야 하는 정규화입니다.

 

 

 

 


 

#2 정규화

 

 

 

<그림 2> 정규화 과정

 

 정규화란 데이터의 중복을 제거하고 비일관성과 비유연성을 해소함으로써 독립성과 재사용성을 확보하여 성능을 향상시키는 과정입니다. 이를 통해 삭제, 수정, 입력과 같은 관리가 가능한 DML(Data Manipulate Language) 성능이 향상될 수 있습니다.

 

  • 제 1 정규형

 

 제 1 정규형이란 기본키가 무엇인지 파악하고, 속성 값(=튜플)이 2개 이상이면 원자값으로 분리된 형태를 의미합니다. 각 컬럼의 값은 분해할 수 없는 단일 값으로 만들고, 몇 개의 어떤 속성으로 유일하게 인스턴스를 식별하는지 찾는 과정입니다. (ex. 제품번호+주문번호) ( ex. 주소1, 주소2, ...)

 

 

  • 제 2 정규형

 

 제 2 정규형은 결정자가 어떤 종속자를 구분한다면 분리를 하거나, 식별자에 종속되지 않는 속성이 있다면 분리를 하는 부분 함수 종속성을 제거한 형태입니다. 예를 들어, 계좌번호와 회원ID(PK)가 식별자(=기본키)이고 계좌명, 이름, 예수금, 관리점이 일반속성이라면, 회원ID가 이름을 함수종속하고 있기 때문에 분리해야 합니다. 따라서 회원ID(PK)인 식별자를 가지며 이름이라는 일반속성을 가진 새로운 테이블이 생성됩니다. 2차 정규화는 기본키가 2개 이상인 경우에만 진행하며, 1개인 경우에는 과정을 생략합니다. 아래는 부분 함수 종속성 제거를 나타낸 그림입니다.

<그림 3> 제 2 정규형

 

 

  • 제 3 정규형

 

 제 3 정규형은 기본키를 제외한 일반 속성들 간에 종속성이 발생한 경우에 분리를 하는 이행 함수 종속성을 제거한 형태입니다. <그림 4> 를 보면, 일반 속성에 관리점과 관리점코드라는 칼럼이 있고, 관리점코드가 관리점을 함수 종속하는 것을 알 수 있습니다.

<그림 4> 3차 정규화

 

 2차 정규화와 마찬가지로 관리점코드(PK)라는 식별자를 가지며 관리점이라는 일반속성을 가진 새로운 테이블이 생성됩니다. 실무에서는 일반적으로 3차 정규화까지만 실행한다는 것도 알아두시면 좋을 것 같아요.

<그림 5> 제 3 정규형

 

  • BCNF

 보이스-코드 정규형은 간단히 말해, 기본키가 후보키를 종속하고 있고, 후보키도 기본키를 종속하고 있다면 분리를 한 형태입니다. 예를 들어, 학번과 과목번호는 모두 기본키로, 교수라는 속성을 종속하고 있어요. 그런데 교수라는 칼럼이 과목번호를 종속을 하고 있기 때문에 분리를 해주어야 합니다.
.

<그림 6> BCNF

 

 

  • 제 4 정규형 및 제 5 정규형

 제 4 정규형은 여러 칼럼들이 하나의 칼럼을 종속시키는 경우, 분해하여 다중값 종속성을 제거한 형태이고, 제 5 정규형은 조인에 의해 종속성이 발생한 경우, 분해하여 조인 종속성을 제거한 형태입니다. 조인(=데이터들을 한 번에 여러 테이블에서 가져오는 방법)을 하는 과정에 발생합니다.

 두 정규형은 높은 수준의 정규화이고 잘 사용되지 않으며, 특별한 상황에만 사용하기 때문에 실제로 정규화를 하기 위해서는 여러 사항을 고려해야 한다는 점이 존재합니다.

 

 

 

 

 

 이러한 정규화를 한다면 중복성, 비유연성, 비일관성을 해소할 수 있습니다. 그러나, 조회(SELECT)의 경우에는 성능이 저하될 수 있습니다. 이러한 경우에는 반정규화를 할 가능성도 있다는 것도 알아주시면 좋아요.

 


 

#3 성능 최적화

 

 정규화를 하고 나서도 성능 최적화 작업이 꼭 필요합니다. 성능 최적화는 데이터베이스의 응답 시간을 줄이고 처리량을 증가시키는데 도움을 줍니다.

 

  • 인덱스 사용 : 검색 속도 향상

테이블에 하나 이상의 배열을 이용하여 구현하는 것이 검색하는 속도에 향상됩니다.

 

  • 파티셔닝 : 쿼리 성능 향상

파티셔닝이란 테이블을 분할하여 특정 파티션에만 접근할 수 있게 하여 성능을 높이는 기술입니다. 정규화랑은 다르게, 논리적으로는 하나의 테이블이지만 여러 개의 데이터 파일로 분산해서 저장시킵니다. 기준은 범위나 값, 해시함수와 같은 것들이 있어요.

 

  • 하드웨어 최적화 : 속도 향상

하드웨어 최적화는 사용자 컴퓨터의 메모리 공간을 충분하게 유지시키면 됩니다.

 

  • 캐싱 : 과부하 방지

마지막으로. 캐싱은 자주 사용하는 데이터나 쿼리 결과를 임시로 복사하여 사용을 해서 부하를 방지하는 기법입니다.

 

 


 

 

#4. 분석

 

 이 글에서는 데이터베이스의 성능 최적화를 위해 구축하고 관리하는 과정에 대해 살펴보았습니다. 정규화의 과정과 성능 최적화 방법에 대해 알아보았지만, 실무에서는 테이블이 수십 개가 될 수 있기 때문에 더욱 복잡한 구조를 정규화하고 최적화하는 실력을 갖춰야 합니다. 최적화.. 귀찮은데 꼭 해야 할까?라고 생각하실 수도 있지만, 데이터베이스는 정보화 시대에 중추적인 역할을 하기 때문에 성능 최적화를 통해 검색과 데이터 처리 속도를 향상시키는 것은 선택이 아닌 필수사항입니다.

 

 

 

 

이미지 출처

https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4

https://blog.naver.com/binspirer/221793603103

'Computer Science' 카테고리의 다른 글

데이터 불균형 문제 해소를 위한 SMOTE와 SMOTEENN 샘플링 기법  (0) 2025.08.26
B+트리를 활용하여 DB 인덱싱하기  (0) 2024.07.23
대규모 데이터베이스 성능 향상을 위한 샤딩 알고리즘  (0) 2024.07.14
BruteForce 공격 방어를 위한 해싱 알고리즘 #2  (0) 2024.07.03
BruteForce 공격 방어를 위한 해싱 알고리즘 #1  (0) 2024.07.02
'Computer Science' 카테고리의 다른 글
  • B+트리를 활용하여 DB 인덱싱하기
  • 대규모 데이터베이스 성능 향상을 위한 샤딩 알고리즘
  • BruteForce 공격 방어를 위한 해싱 알고리즘 #2
  • BruteForce 공격 방어를 위한 해싱 알고리즘 #1
Cloud9Ops
Cloud9Ops
CloudOps 지망생입니다. 스스로의 공부를 위한, 더 많은 사람들이 양질의 지식을 습득하는 공간입니다.
  • Cloud9Ops
    CloudOps Engineer
    Cloud9Ops
  • 전체
    오늘
    어제
    • 전체 (23)
      • Computer Science (16)
      • Programming (2)
      • Projects (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    정규화
    해시 체이닝
    데이터베이스 인덱싱
    캐시
    비동기적 처리
    성능 최적화
    SQL 인젝션
    컨시스턴트 해싱
    해싱
    BruteForce
    B+트리
    단방향 알고리즘
    샤딩
    해시 테이블
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Cloud9Ops
데이터베이스 정규화와 성능 최적화 전략
상단으로

티스토리툴바