sungyup's.

PostgreSQL / Database Structure Design Patterns / 3.1 SQL Design Tool

3.1SQL Design Tool

데이터베이스 구조를 도식으로 그리게 도와주는 스키마 디자이너

이번 섹션에서는 데이터베이스 구조 디자인을 배워볼텐데, Instagram 서비스를 예시로 필요한 테이블들, 데이터 구조를 디자인해보자.

Schema Designer

데이터베이스 구조 디자인을 할 때는 보통 많은 테이블들과 많은 데이터 열들이 필요하다. 그렇기에 복잡한 데이터베이스 구조를 보다 명확히 디자인하기 위해 일반적으로는 데이터베이스 스키마를 도식으로 그린다. 이 작업을 돕는 프로그램들을 Schema Designer라고 한다. 아래는 그 예시들이다.

Schema Designer들은 크게 두 종류로 나뉘는데, 간단한 코드를 적어 자동으로 도식이 그려지게 하는 방식직접 도식을 그리는 방식이다.

코드를 적어 자동으로 도식 그리기

앞서 언급한 dbdiagram.io는 간단한 예시 코드를 제공하는데, 해당 코드만 봐도 필요한 문법을 이해할 수 있을 정도로 쉽게 되어 있기 때문에 기본 예시 코드를 수정해 원하는 테이블 구조를 그릴 수 있다.

dbdiagram.io
왼쪽에 제공된 기본 코드를 수정하면 오른쪽에 테이블 구조가 그려지는 도식을 수정할 수 있다

직접 그리기

테이블 추가 버튼을 누르고, Add table, Add field, Add Foreign Key 등 버튼을 누르고 수동으로 테이블들의 위치를 수정하는 등의 과정을 통해 데이터 스키마를 그리는 방식이다. 앞서 언급한 것 중 ondras.zarovi.cz/sql/demo가 그 예다.

sql schema designer
필요한 버튼을 누르고 원하는 위치에 눌러 테이블을 추가하고 구조를 지정할 수 있다.

Instagram 예시에 맞는 스키마 디자인하기

이번 섹션에서는 dbdiagram.io를 통해 작업한다.

본격적인 기능들(like, mention, hashtag 등)을 추가하기 전에, 기본적으로 필요한 테이블들과 구성 요소들을 그려보자.

우선은 유저가 필요하다. 유저는 id, username 외에도 언제 가입했는지, 언제 정보를 업데이트 했는지의 정보를 포함해야 한다.

sql
Table users { id SERIAL [pk, increment] created_at TIMESTAMP updated_at TIMESTAMP username VARCHAR(30) }

다음으로는 유저가 올린 포스트다. 포스트도 id, 데이터가 보관된 url이 필요하고 created_at, updated_at이 필요하다. 유저 한명당 여러 포스트 데이터를 가질 수 있으므로 foreign key가 user_id로 지정되어야 한다.

sql
Table posts { id SERIAL [pk, increment] created_at TIMESTAMP updated_at TIMESTAMP url VARCHAR(200) user_id INTEGER [ref: > users.id] }

다음으로, 유저들의 댓글도 필요하다. 여기도 id가 필요하고, created_at, updated_at이 필요하며 유저들이 남긴 댓글 내용(contents)도 필요하다. 유저마다 여러 댓글 데이터를 가질 수 있고, 포스트마다도 여러 댓글을 가질 수 있으므로 user_id, post_id 두 개의 foreign key가 필요하다.

sql
Table comments { id SERIAL [pk, increment] created_at TIMESTAMP updated_at TIMESTAMP contents VARCHAR(240) user_id INTEGER [ref: > users.id] post_id INTEGER [ref: > posts.id] }

아래는 이렇게 만든 dbdiagram.io 도식이다. 여기서 시작해, 인스타그램의 다양한 기능들을 포함한 데이터 스키마를 그려보자.

basic schema for instagram
유저, 포스트, 커멘트로 구성된 기본적인 스키마다.