SQL DB 설계에 있어 중요하게 생각하는 점은 무엇이 있을까?
위의 주제의 질문에 대한 답을 필자는 "요구사항에 맞게 꼼꼼하게 검수 한 다음 DB를 설계하는 것"이라는 생각해본다.
한 프로젝트를 진행하게 되면 프로젝트 기획 단계에 정말 많은 시간을 쏟아부어 백엔드 전반의 전체적인 아웃라인을 잡게 되는데 이 부분이 정말 중요한 부분이지만 "이 정도면 됐겠지?"와 같은 안일함으로 기획 단계에 임했다가 프로젝트 도중에 몽땅 뒤엎거나 많은 수정 시간을 필요로 하여 예상 시간이 훨씬 많이 걸렸던 적이 부지기수이다.
이처럼 DB설계를 잘못하게 되면 향후에 유지보수 비용이 엄청나게 들어 갈 수 있고 그렇기에 초기에 설계를 잘해두어야 시간과 비용을 절약할 수 있다. SQL Query도 비슷한 맥락으로 Query 잘못 짜게 되면 성능이 느려지고 부정확한 결과가 나오게 된다.
그리고 이미 만들어진 DB의 구조는 바꾸기가 쉽지 않다. 수많은 시스템에 연계되어 있기 때문에 구조를 바꾸게 되면 시스템 전체가 흔들리는 일까지도 발생할 수 있고, 영향범위가 넓어 섣불리 변경할 수 없다. 그렇기에 신중에 신중을 기해서 설계하고 구축해야 한다.
[DB의 설계과정]
DB설계를 진행함에 있어 어떻게 설계를 할 것인지 요구사항들을 수집/분석하여 개발할 시 DB의 용도를 파악한다. 그리고 여기에 필요한 데이터가 무엇인지 이 데이터에 어떤 처리가 필요한지를 고려하게 된다. 그렇게 해서 나오는 결과물이 요구사항 명세서이다. 그리고 이를 분석하여 본격적인 설계에 들어가게 된다.
여기서 설계는 총 3단계로 나누어지게 되는데 개념적 설계, 논리적 설계, 물리적 설계이다.
1. 개념적 설계
요구사항 분석 결과를 기반으로 중요한 엔티티를 추출하고 엔티티 간의 관계를 결정해서 E-R 다이어그램으로 표현한다.
2. 논리적 설계
DBMS(다수의 사용자들이 DB내의 데이터를 접근할 수 있도록 해주는 소프트웨어 도구의 집합이다. DBMS은 사용자 또는 다른 프로그램의 요구를 처리하고 적절히 응답하여 데이터를 사용할 수 있도록 해준다)에 적합한 논리적 스키마를 설계하는 단계로 개념적 스키마를 논리적 데이터 모델을 이용해 논리적 구조로 표현한다.
쉽게 말해 개념적 단계의 결과물인 E-R 다이어그램을 릴레이션 스키마로 변환하는 것이다.
그리고 속성의 데이터 타입, null 값 허용여부, 기본 값, 제약 조건 등을 세부적으로 결정하고 결과를 문서화시킨다.
3. 물리적 설계
DBMS로 구현 가능한 물리적 구조 설계로 하드웨어나 운영체제의 특성을 고려해서 필요한 인덱스 구조나 내부 저장 구조 등에 대한 물리적 구조를 설계하는 단계이다.
이 과정이 모두 완료되고 위와 같은 SQL 문으로 작성한 명령문을 DBMS에서 실행해서 DB를 실제로 생성하는 것이다.
SQL은 DB와 소통하기 위한 언어로 DB가 알아들을 수 있는 언어로 정보를 요청해야 DB가 그것을 이해하고 우리가 원하는 데이터를 원하는 포맷으로 내어주는 역할을 한다.
이처럼 DB 설계란 사용자의 요구를 분석해서 그것들을 컴퓨터에 저장할 수 있는 DB의 구조에 맞게 변형한 후 특정 DBMS로 DB를 구현하여 일반 사용자들이 사용하게 하는 것이다.
DB 설계 시에는 유의해야 할 고려사항이 존재한다.
1. 무결성 : 삽입, 삭제, 갱신 등의 연산 후에도 데이터베이스에 저장된 데이터가 정해진 제약조건을 항상 만족해야 함
2. 일관성 : DB에 저장된 데이터들 사이나, 특정 질의에 대한 응답이 처음부터 끝까지 변함없이 일정해야 함
3. 회복 : 시스템에 장애가 발생했을 때 장애 발생 직전의 상태로 복구할 수 있어야 함
4. 보안 : 불법적인 데이터의 노출 또는 변경이나 손실로부터 보호할 수 있어야 함
5. 효율성 : 응답 시간의 단축, 시스템의 생산성, 저장 공간의 최적화 등이 가능해야 함
6. DB확장 : 데이터베이스 운영에 영향을 주지 않으면서 지속적으로 데이터를 추가할 수 있어야 함
'TIL' 카테고리의 다른 글
6/15[TIL] SQL 과 NoSQL 이란? (0) | 2021.06.15 |
---|---|
6/9[TIL] ORM 사용의 장점과 단점은? (0) | 2021.06.09 |
6/3[TIL] Database Indexing이란 무엇이며 왜 하는가요? (0) | 2021.06.03 |
6/2[TIL] Transaction 이란 무엇이며 언제 사용하는가 (0) | 2021.06.02 |
5/31[TIL] SQL Injection 이란 무엇이며 어떻게 막을 수 있을까요? (0) | 2021.05.31 |