본문 바로가기
MariaDB

게시판 DB 테이블 설계하기

by 향테크 2025. 1. 27.

MariaDB 게시판 테이블설계

 

목차

 

오늘은 MariaDB로 게시판 테이블 설계에 대해서 이야기해보려고 합니다.

웹개발을 하다 보면 게시판은 가장 기본적이면서도 중요한 기능 중 하나입니다.

개인적으로 모든 웹 애플리케이션은 게시판의 확장형이라고 생각을 하는 개발자 중 하나입니다.

 

티스토리 공지사항 화면을 보면서 웹기획자가 스토리보드를 작성했다고 생각하면서 설계를 진행토록 하겠습니다.

 

요구사항 확인하기

요구사항이 스토리보드로 문서화가 된 게 없기에, 예를 들어 티스토리 공지사항 화면을 보면서 요구사항을 확인해 보도록 하겠습니다.

 

공지사항 목록화면

  • 공지사항별 카테고리, 제목, 내용이 몇 글자씩 요약돼서 나옵니다.
  • 공지사항별 첨부된 이미지가 있는데, 본문에 포함된 이미지를 불러오도록 합니다.

티스토리 목록 화면

 

공지사항 상세화면

  • 상세화면으로 이동하면 카테고리, 제목, 작성자, 작성일, 내용이 보입니다.

티스토리 상세화면 상단

 

  • 상세화면 하단에는 대표적으로 좋아요와 댓글 기능이 있습니다.

티스토리 상세화면 하단

 

최종 요구사항

  • 공지사항에 카테고리, 작성자, 제목, 내용, 작성일 등을 구성
  • 공지사항 게시물별, 회원별로 좋아요 기능
  • 공지사항별 댓글 구성
  • 게시판 카테고리 관리 기능

 

테이블 설계

요구사항으로 확인해봤을때는 크게 5개의 테이블을 설계하면 될 듯합니다.

  • 게시물 테이블 : tb_board
  • 게시물 카테고리 관리 테이블 : tb_board_category
  • 게시물 댓글 관리 테이블 : tb_board_comment
  • 게시물 좋아요 관리 테이블 : tb_board_like
  • 회원 테이블 : tb_member

ERD(Entity-Relationship Diagram)는 ERDCloud를 이용해서 작성하도록 하겠습니다.

 

ERDCloud?

ERDCloud는 웹 기반의 ERD 설계 도구로, 데이터베이스 모델링을 쉽게 할 수 있도록 도와줍니다.

공식 웹사이트 : https://erdcloud.com

 

ERDCloud

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

 

주요 기능

  • 웹 기반 : 별도 설치 없이 브라우저에서 사용 가능합니다.
  • ERD 작성 : 드래그 앤 드랍으로 엔티티와 관계를 쉽게 설계할 수 있습니다.
  • 협업 기능 : 여러 사용자가 동시에 작업하고 실시간으로 공유할 수 있습니다.
  • 다양한 DB 지원 : MySQL, Oracle, ProstgreSQL 등 여러 데이터베이스와 호환됩니다.
  • SQL 생성 : ERD를 기반으로 SQL 스크립트를 자동 생성합니다.
  • 임포트/익스포트 : 기존 데이터베이스 스키마를 임포트 하거나 ERD를 다양한 형식으로 익스포트 할 수 있습니다.

ERD

ERDCloud로 그린 ERD

 

공통사항

  • 테이블별 명칭은 tb_ 로 시작되며 각 테이블 의미에 맞게 테이블명을 작성하였습니다.
  • 테이블마다 공통으로 작성자, 작성일, 수정자, 수정일, 상태 칼럼을 추가하였습니다.
  • 데이터를 삭제할 때 실제로 데이터를 DELETE 하지 않고, STATUS 칼럼을 이용하여 1 이면 정상, -1이라면 삭제된 데이터로 관리하도록 하겠습니다. 혹시 모르게 실수로 데이터를 지웠거나 복구를 위함입니다.
  • PK는 ID라는 칼럼명으로 사용하며, INT형으로 AUTO_INCREEMENT로 설정하도록 하였습니다.
  • 단, PK 칼럼이 다른 테이블에 참조될 때는 테이블명 약자_ID로 정하였습니다.
  • FK 설정은 하지 않도록 하겠습니다.

설계내용

  • 회원 : 회원 아이디 경우 중복되면 안 되기 때문에 UNIQUE 속성을 추가하도록 하겠습니다.
  • 게시판 : 게시판에는 회원 테이블, 카테고리 테이블을 JOIN 해서 사용할 예정이고, 조회수 경우 게시물을 조회할 때마다 +1씩 업데이트하겠습니다.
  • 게시판 댓글, 카테고리 : 게시판 테이블처럼 ID 명칭으로 자동증가 속성을 이용해 PK를 구성하였습니다.
  • 게시판 좋아요 : 다른 테이블처럼 자동증가를 사용하지 않았고, 게시물별 회원별 한 번씩만 좋아요가 가능해야 하기 때문에 중복 좋아요를 물리적으로 방지하기 위해서 게시판, 회원 일련번호로 PK를 구성하였습니다. 단, 좋아요 취소 시 데이터를 물리적으로 삭제해야 하는 단점이 있습니다.

 

테이블 생성 스크립트

CREATE TABLE `tb_member` (
	`ID`	    INT	NOT NULL	AUTO_INCREMENT COMMENT '자동증가',
	`USER_ID`	VARCHAR(100)	NULL COMMENT '회원아이디',
	`PASSWORD`	VARCHAR(100)	NULL COMMENT '암호화처리',
	`USER_NM`	VARCHAR(20)	    NULL COMMENT '회원명',
	`EMAIL`	    VARCHAR(100)    NULL COMMENT '이메일',
	`REG_ID`	INT	            NULL COMMENT '등록자',
	`REG_DATE`	DATETIME	    NULL DEFAULT NOW() COMMENT '등록일',
	`UPD_ID`	INT	            NULL COMMENT '수정자',
	`UPD_DATE`	DATETIME	    NULL COMMENT '수정일',
	PRIMARY KEY (ID),
	UNIQUE (USER_ID)
) COMMENT = '회원 관리';


CREATE TABLE `tb_board` (
	`ID`	        INT	                NOT NULL	    AUTO_INCREMENT COMMENT '자동증가',
	`MEMBER_ID`	    INT	                NOT NULL        COMMENT '회원 일련번호',
	`CATEGORY_ID`	INT	            NOT NULL	COMMENT '카테고리 일련번호',
	`TITLE`	        VARCHAR(1000)   NULL COMMENT '제목',
	`CONTENTS`	    TEXT            NULL COMMENT '내용',
	`HIT_CNT`	    INT	NULL	        DEFAULT 0 COMMENT '조회수',
	`REG_ID`	    INT	                NULL COMMENT '등록자',
	`REG_DATE`	    DATETIME	        NULL DEFAULT NOW() COMMENT '등록일',
	`UPD_ID`	    INT	                NULL COMMENT '수정자',
	`UPD_DATE`	    DATETIME	        NULL COMMENT '수정일',
	`STATUS`	    TINYINT	            NULL COMMENT '상태',
	PRIMARY KEY (ID)
) COMMENT = '게시물 관리';


CREATE TABLE `tb_board_comment` (
	`ID`	INT	NOT NULL	COMMENT '자동증가',
	`BOARD_ID`	INT	NOT NULL	COMMENT '게시물 일련번호',
	`MEMBER_ID`	INT	NOT NULL	COMMENT '자동증가',
	`COMMENT`	VARCHAR(4000)	NULL,
	`REG_ID`	    INT	                NULL COMMENT '등록자',
	`REG_DATE`	    DATETIME	        NULL DEFAULT NOW() COMMENT '등록일',
	`UPD_ID`	    INT	                NULL COMMENT '수정자',
	`UPD_DATE`	    DATETIME	        NULL COMMENT '수정일',
	`STATUS`	    TINYINT	            NULL COMMENT '상태',
	PRIMARY KEY (ID)
) COMMENT = '게시물 댓글 관리';


CREATE TABLE `tb_board_category` (
	`ID`	INT	NOT NULL	COMMENT '자동증가',
	`CATEGORY_NM`	VARCHAR(100)	NULL,
	`PRT_ORD`	TINYINT	NULL,
	`REG_ID`	    INT	                NULL COMMENT '등록자',
	`REG_DATE`	    DATETIME	        NULL DEFAULT NOW() COMMENT '등록일',
	`UPD_ID`	    INT	                NULL COMMENT '수정자',
	`UPD_DATE`	    DATETIME	        NULL COMMENT '수정일',
	`STATUS`	    TINYINT	            NULL COMMENT '상태',
	PRIMARY KEY (ID)
) COMMENT = '게시물 카테고리 관리';


CREATE TABLE `tb_board_like` (
	`BOARD_ID`	INT	NOT NULL	COMMENT '자동증가',
	`MEMBER_ID`	INT	NOT NULL	COMMENT '자동증가',
	`REG_DATE`	DATETIME	NULL	DEFAULT NOW(),
	PRIMARY KEY (BOARD_ID, MEMBER_ID)
) COMMENT = '게시물 좋아요 관리';

 

테이블 생성 스크립트를 데이터베이스에서 실행하여 테이블을 생성하였습니다.

테이블 생성 결과

 

마무리

위와 같이 간단한 게시판 테이블을 설계를 해보았습니다.

데이터베이스를 사용하는 모든 애플리케이션을 개발하기 위해서는 업무를 파악하고, 테이블 설계가 먼저 되어야 어플리케이션을 개발할 수 있습니다. 

 

원래는 SELECT 문법에 대해서 먼저 글을 작성하려고 하였는데, 기본적인 테이블이 있어야 SELECT 문을 실행할 수 있을 거라 생각해서 테이블 설계를 먼저 해보게 되었네요.

 

다음번에는 이번에 생성한 테이블에 임시 데이터를 입력하고, SELECT 문법에 대해 소개하는 시간을 가져보도록 하겠습니다.

감사합니다.

 

728x90
반응형