지난번에 Database란 무언가 인지 간단히 알아봤다.
오늘은 데이터 베이스중 관계형 DB설계는 어떻게 해야하는지 예제와 함께 알아보겠다.
요구사항 및 분석
요구사항은 Blog 서비스를 위한 데이터베이스를 만드는 것이다. 그렇다면 어떻게 데이터베이스를 설계하면 좋을것인가?
- 먼저 각 기능별로 필요한 객체 데이터를 정리하는 것이다. Blog를 만들기 위해선 blog 객체가 필요할 것이고 그 안에 있을 category, likes, poster, reply 등등 많은 객체 들이 필요할 것이다 물론 user객체도 필요하다.
- 하지만 무턱대고 위의 요구사항대로 만드는 것은 데이터 스키마를 수정할 확률이 높다. 요구사항중 가장 디테일한 기능 즉 블로그 포스터 화면의 요구사항부터 작성해야 나중에 수정할 확률이 낮을 것이다.
- 요구사항에 따라 필요한 객체를 분석하였다면 이제 테이블을 만들어야 한다. 테이블은 데이터를 구조화하고 저장하기 위해 사용되는 가장 기본적인 데이터 구조 행과 열로 나타난다. 밑의 사진을 보면 이해가 빠를 것이다.
- 그럼 테이블은 어떻게 만들어야 하는지 알아보자. 테이블은 먼저 각 Row(열)의 고유 키값인 PK (Primary Key, 기본 키) 값을 설정해야 한다. PK를 사용면 데이터의 고유성과 무결성을 보장할 수 있으며, 테이블 간의 관계를 설정하는 데 도움이 된다. 앞으로는 모르겠지만 현재 설계에선 PK는 Auto Increment를 사용하여 저절로 1씩 증가하는 고유의 값을 가지게 설정해 놨다.
- 다음으로는 PK외의 다른 Column을 설정하는 것이다. 예를 들어 유저에는 user_name, user_phone, user_email ..등이 있을 것이다. 여기서 Column 설정을 할 때 DataType (INT, Char, Enum, Datetime) 등과 함께 NN(Not null), UQ(Unique), B(Binary), UN(Unsigned), ZF(Zero Fill), 등의 값을 설정해야 한다.
한 테이블에 모든 정보를 ?
다음으로 Blog 객체의 테이블을 만든다고 생각해보자. Blog객체 안에는 user보다 훨씬 더 많은 정보가 들어갈 것이다. 이러한 값을 Blog객체에 모두 넣는다면 어떻게 될까? 여러가지 문제가 있을 것이다. 가령 성능저하, 중복데이터의 저장, 쿼리 복잡성, 유연성 제한 등의 문제가 있을 수 있다. 이러한 문제들을 해결하기 위해 테이블을 분리하고 id(PK)를 통해 관계를 형성해 주는 것이 관계형 데이터 베이스의 특징이다.
테이블 분리
그렇다면 어느정도 분리해야 좋은 테이블일까 라는 생각을 할 것이다. 예를 들어, 게시물(poster) 테이블에 좋아요(하트)를 누르는 기능이 있을 때, likes 컬럼을 추가하여 간단하게 처리하는 것이 나쁘지 않을 것으로 생각한다. 한 유저가 좋아요를 누르면 likes컬럼의 값을 1씩 간단히 올리면 되는 것이다. 하지만 나중에 likes를 이용하여 어떠한 사람이 하트 버튼을 언제 눌렀는지 알고 싶으면 어떻게 해야 할까? 이때 문제가 발생하는 것 이다. likes 테이블을 따로 또 만들고 저장해야 하는 것 이다. 이런한 문제를 해결하기 위해 테이블의 특성을 잘 분석해 적절히 분리하여 만드는 것이 좋을 것이다. 이렇게 설계를 한다면 특정 사용자가 어떤 게시물에 좋아요를 누른 이력을 조회하거나, 좋아요를 누른 게시물 중에서 인기 있는 게시물을 식별하는 등의 작업이 가능해질 것이다. 즉 테이블을 분리하면 기존의 데이터 베이스의 구조를 변경하지 않고도 확장적으로 기능을 사용할 수 있는 것이다.
스키마
스키마(Schema)는 데이터베이스에서 데이터의 구조와 구성을 정의하는 개념이다. 위와 같이 만들어진 테이블들과 뷰, 인덱스 등의 집합은 데이터 베이스의 구조에 맞게 저장된다. 나중에 데이터에 접근할 때 "스키마"를 참고하여 구조와 구성을 보고 접근 하는 것이다.
ERD 다이아그램
마지막으로 간략하게 만들어본 블로그 데이터 베이스를 ERD 다이아 그램으로 표현해 봤다. 다음과 같이 테이블을 따로 만들었지만 관계를 맺고 서로 참조 하게 되어있다.