[DB] 데이터베이스 설계

bien·2024년 7월 8일
0

데이터베이스

목록 보기
17/17

데이터베이스 설계란?

데이터베이스 설계는 프로그램에서 만들어지는 데이터를 저장하기 위해 데이터의 구조와 데이터 간 관계를 정의하는 것이다. 데이터 간 관계 정의를 위해 사용하게 될 데이터베이스는 관계형 데이터베이스이고 데이터베이스 설계로 나오는 최종 산출물은 ERD(Entity Relationship Diagram: 객체관계도)가 된다.

데이터 베이스를 설계할 때는 처음부터 데이터베이스에 만들지않는다.
프로그램을 제작할 때 바로 코드를 작성하지 않는 것과 같다.
데이터베이스를 설계하는 방법을 보면 다음과 같다.

  1. 프로그램 명세서까지 설계된 결과물에서 필요한 데이터 값을 추출한다.
  2. 추출된 값을 나열하고 유사한 것을 그룹핑하고 논리적 관계를 생성한다.
  3. 논리적 설계에 문제가 없는지 검증한다. 검증은 논리적 설계의 일부로 본다.
  4. 데이터베이스에 생성될 데이터형, 규칙, 제한, 관계를 정의하고 물리적으로 생성한다.

1단계, 개념적 데이터베이스 설계

개념적 모델에서는 요구에 따라 필요한 데이터를 정의하고 그 데이터들간의 관계를 정의하는 것이 주된 작업이며, 가능한 한 데이터를 모두 나열하고 그룹핑한다.
또한 그룹핑된 자료와의 관계를 정의한다.

설계된 결과를 보면 프로그램 명세서에서 말한 항목을 도식화한 것이다. 차이가 있다면 개념적으로 그룹핑되어 있다는 것이다. 이것은 향후 논리적 설계를 할 때도 근간을 이루는 구조가 된다. 개념적 데이터베이스 설계는 특정 데이터베이스 시스템에 의존적이거나 종속적이지 않다. 그림에서 보이듯이 구성되는 항목에 데이터 타입이나 크기 등이 명시되어 있지 않다.

데이터베이스의 설계 과정에서는 개념적 설계가 존재하기는 하나 실제로 이 단계를 거치면서 설계할 만큼 여유 있는 프로젝트는 많지 않다. 지금까지 해왔던 프로젝트에서 개념적 데이터베이스 설계를 꼼꼼하게 진행했던 경우는 거의 없었다. 오히려 다음에 나오는 논리적 데이터베이스 설계에 더 많은 시간을 할애하는 것이 옳아보인다.

2단계, 논리적 데이터베이스 설계

논리적 설계는 데이터베이스 설계에서 가장 중요한 절차다. 논리적 데이터베이스 설계는 실제 만들어지는 데이터베이스의 구조를 정의한다. 프로그램을 설계하면서 이미 개념적인 설계가 이루어졌으므로, 전 단계인 기념적 설계의 진행 여부는 크게 중요하지 않다.

데이터베이스 설계보다 더 중요한 것이 설계 검증이다.

설계를 마쳣다면 반드시 실제 데이터를 넣어보면서 논리적으로 구성된 설계 속에서 프로그램을 구동했을 때 적당한 결과를 가지고 올 수 있는지를 검증해야 한다. 논리적 설계에서는 문제가 없다는 확신이 있어야 한다. 이렇게 검증을 하더라도 개발을 하다 보면 분명 데이터베이스 설계를 변경하는 경우가 발생한다.

논리적 설계는 지금까지 프로그램을 설계하면서 또는 개념적 설계의 결과로 구성된 논리적인 구조를 정의하기 위한 단계다. 논리적 설계를 하면서 중요하게 생각해야 하는 것들이 있는데, 아래와 같다.

  1. 중복된 데이터를 생성하지 않는다.
  2. 관련 있는 데이터의 그룹핑
  3. 검색 성능을 고려한 설계

관련된 데이터의 그룹핑

데이터를 읽거나 쓸 때 같은 종류의 데이터를 동시에 사용하는 경우가 많기 때문에, 같은 종류의 데이터를 한 곳에 모아놓으면 성능이 더 우수할 수 있다. 다시 말해 관련 있는 데이터들의 그룹핑은 동시에 작업이 일어나는 것들에 대한 모음이라 할 수 있다.

검색 성능을 고려한 설계

데이터 중에 지속적으로 늘어나는 구조를 가지고 있는 데이터가 있는데, 일반적으로 이런 데이터는 운영하면서 생성되는 데이터이며 가장 중요한 데이터이기도 하다. 지속적으로 늘어나는 데이터는 시간이 지날 수록 검색 속도가 느려지기 마련이므로, 초기 설계부터 검색에 용이한 구조를 생각해야 한다. 빈번하게 조회되는 데이터만 따로 모아 별도의 데이터 구조를 생성하고 유사한 데이터는 그룹핑해서 읽고 슬 때보다 향상된 결과가 나오도록 해야 한다. 한 개의 테이블에 있는 데이터를 읽었을 때와 흩어져 있는 데이터를 읽기 위해 조인을 사용한 경우라 할 수 있다.

정규화는 결국 중복 방지 때문

정규화의 목적을 보면 다음과 같다. '정규화는 정보의 중복으로 발생할 수 있는 문제점, 즉 삽입, 삭제, 갱신 등의 과정에서 발생할 수 있는 이상(Anomaly) 현상을 방지함에 있다.' 결국 정규화의 목적은 데이터베이스 설계의 첫 번째 원칙을 지키기 위한 절차를 나타낸 것이다. 정규화라는 것은 반드시 필요하며, 그 목적은 중복을 방지하는 일이다.

데이터베이스 설계에서 검증이 가장 중요하다.

논리적 설계를 한 이후에는 그 결과를 반드시 검증해봐야 한다. 이 역시 이후 변경에서 오는 비용을 최소화하는 것이 목적이다. 검증은 실제 데이터가 들어가는 것을 가정하여 데이터를 넣어가며 프로세스를 돌려보는 것이다. 이 작업은 논리적 설계가 제대로 되었는지 확인할 수 있는 아주 중요한 과정이다.

프로그램을 작성하기 이전에 실제 데이터를 넣어보고 운영해 본다는 것인데 이렇게 하기 위해서는 데이터베이스에 데이터가 쌓이는 것과 같은 구조를 표현할 수 있어야 한다. 엑셀을 이용해 이같은 데이터베이스의 구조를 쉽게 표현해볼 수 있다. 엑셀로 타이틀을 만들고 그 밑으로 데이터를 추가하여 데이터베이스의 데이터 구조와 동일한 형태를 쉽게 구성할 수 있다. 이 구성으로 데이터를 검증하고 데이터가 쌓이게 되면 논리적 설계에서 보이지 않았던 구조적인 문제도 보이게 된다.

3단계, 물리적 데이터베이스 설계

물리적 데이터베이스 설계는 데이터베이스에 만들어질 구조와 이름, 자료의 크기, 인덱스 들을 정의한다. 물리적 데이터베이스 설계는 특정 데이터베이스 시스템에 맞추어 설계된다. 따라서 이 단계부터는 대상 데이터베이스의 특성에 맞춘 설계를 수행해야 한다. 논리적 설계를 물리적 설계로 전환하는 과정에서 항목이 추가될 수 있는데, 대표적으로 등록자, 등록일, 수정자, 수정일 4가지 항목을 모든 데이터 구조에 추가할 수 있다.

논리적 구조를 물리적 구조로 만드는 과정은 실제 데이터베이스에 테이블과 테이블을 구성하는 컬럼을 생성하고 테이블의 기본 키를 만드는 과정이다. 또한 테이블 간의 물리적 관계를 정의하고 검색에 필요한 인덱스를 정의하는 작업도 하게 된다. 이같은 작업을 실제 데이버테이스에 직접 하게 되면 설계가 변경되는 것을 반영하는 과정이 매우 번거롭게 된다.

물리적 데이터베이스를 설계하면서 가장 중요한 것은 적절한 인덱스를 정의하는 것이다. 인덱스는 검색 성능에 직접적인 영향을 주며 필요한 곳에 적절한 인덱스를 정의하지 않았을 때 발생하는 결과로 데이터베이스 서버가 다운되기도 한다. 인덱스는 데이터 검색 성능을 높여주는 자료구조다. 검색으로 인해 발생하는 성능의 저한느 적절한 인덱스를 생성하여 대부분 해결할 수 있다.

Tip) 정규화와 역정규화를 해야 할 때

데이터베이스를 설계하면서 검색 성능을 고려해야 한다. 인덱스 활용이 검색 속도를 개선시키는 좋은 방법이지만, 또 한가지 방법으로 역정규화를 고려해볼 수 있다. 역정규화는 정규화의 반대로 중복을 허용하는 구조를 말한다. 중복 데이터 생성 원칙과 대립되는 개념이다.

역정규화를 하는 이유는 대부분 검색의 효율을 높이기 위해서다. 역정규화를 하는 대상은 조건이 있는데, 변경되지 않은 데이터이거나 변경해도 당시 데이터로도 충분하 가치를 지니는 경우에 가능하다. (ex. 사용자의 아이디, 이름) 빈번히 변경될 가능성이 있는 데이터를 역정규화할 경우가 바로 정규화에서 말하는 이상(Anomaly) 현상의 발생 가능성을 높인다. 이상 현상이 발생해도 무관한지를 고민해봐야 한다.

역정규화는 반드시 정규화가 끝난 다음 필요에 따라 진행한다. 초기 운영은 역정규화 없이 진행하다가 운영에 문제가 발생했을 때 역정규화를 고려해도 늦지 않다. 검색 구문ㅇ르 쉽게 사용하기 위한 역정규화는 절대 하지 않는다.


Reference

  • 프로젝트 관리자를 위한 프로젝트 관리 이야기: 신진현
profile
Good Luck!

0개의 댓글