22년 5월 마지막주 월요일 - 좋은 DB설계란 무엇인가?

1 분 소요

좋은 DB 설계란 무엇인가?

요즘은 회사에서 운영 중인 데이터 라벨링 툴의 신규 버전을 개발하고 있다. 그것도 메이저 넘버링을 바꾸는, 사실상 기존 코드를 전부 들어내고 베이스부터 다시 개발하는 작업을 진행하고 있어서 여러모로 배울 것도 많고 성장에 큰 도움이 될만한 작업들을 하고 있다.

오늘은 선임이 표현하기로 ‘가장 중요한 작업 중의 하나’인 DB 설계를 같이 고민했는데, 그러다보니 좋은 DB 설계란 무엇인지를 중점적으로 생각해보게 되었다. 코딩 교육과정에서도 필수적으로 들어가고, SQLD 자격증 공부를 하면서도 봤던 내용이지만 이론으로만 받아들이는 것과 실제 업무를 위해 고민하는 건 확실히 큰 차이가 있다.

이전 버전을 싹 갈아엎는 이유도 사실은 스타트업의 MVP를 계속 덧대가며 발전시킨 현재 서비스 특성상 신경쓰지 못했던 DB 구조로 인해 발생하는 문제들을 단순 쿼리 개선 정도로는 보완할 수 없을 지경에 이르렀기 때문이라고 한다. 그러니 이번에는 추후 확장성까지도 고려해가며 탄탄한 기반을 만들어야하는 것이다.

그래서 좋은 구조의 DB를 설계하는 방법은 무엇일까? 모든 것이 그러하듯 단 하나의 정답이 있지는 않아보이나 일단 기본적으로 할 수 있는 건 ‘나쁜 설계 방법을 피하는 것’이다. 그래서 우리는 주로 현재 버전이 가진 문제점들을 답습하지 않고 개선시키는 방향을 중점적으로 살펴봤다.

주로 보였던 문제는 테이블 간 중복되는 데이터들이 많았고, 로그성 데이터들이 제대로 관리되고 있지 않다는 점들이었다. 그외 내용들을 파다보니 결국은 기본에 충실한 설계만 이루어져도 대부분 해결 될 수 있을만한 문제들이었다. (하지만 기본에 충실하기란 얼마나 어려운가…)

대충 ‘기본’이라고 정의 될 수 있는 건 아래 정도의 내용들이 아닐까?

  • 무결성 : 삽입, 삭제, 갱신 등의 연산 후에도 데이터베이스에 저장된 데이터가 정해진 제약 조건을 항상 만족하도록 한다.
  • 일관성 : 데이터베이스에 저장된 데이터들 사이나, 특정 질의에 대한 응답이 처음부터 끝까지 변함없이 일정하도록 한다.
  • 회복 : 시스템에 장애가 발생했을 때 장애 발생 직전의 상태로 복구할 수 있도록 한다.
  • 보안 : 불법적인 데이터의 노출 또는 변경이나 손실로부터 보호할 수 있도록 한다.
  • 효율성 : 응답시간의 단축, 시스템의 생산성, 저장 공간의 최적화 등이 가능하도록 한다.
  • 데이터베이스 확장 : 데이터베이스 운영에 영향을 주지 않으면서 지속적으로 데이터를 추가할 수 있도록 한다.

효율을 위해 일부러 반정규화 작업도 하는데, 이 중에서 무결성과 일관성만 지킬 수 있어도 “나쁜 DB”는 피할 수 있지 않을까 싶다…는 내 생각이고 오늘 같은 업무 경험을 기억하며 추후에 DB에 대해서 더 깊게 공부할 필요성을 느꼈다.

댓글남기기