오늘은 어제 예정했던 대로 데이터베이스 테이블을 설계하고, MySQL Workbench를 이용하여 간단한 ERD(Entity-Relationship Diagram)를 작성하였습니다.
ERD는 개체(Entity)와 그들 사이의 관계(Relationship)를 시각적으로 나타낸 다이어그램으로, 데이터베이스 테이블의 구조와 관계를 쉽게 이해할 수 있도록 도와줍니다.
ERD는 주로 다음과 같은 구성 요소로 이루어집니다:
Entity: 데이터베이스 테이블을 나타냅니다. 각 엔티티는 테이블의 이름과 그 안에 포함된 속성(Attributes)으로 표현됩니다.
Relationship: 테이블 간의 관계를 나타냅니다. 일대일, 일대다, 다대다 등의 관계를 표현할 수 있습니다.
Attribute: 각 엔티티에 속하는 속성을 나타냅니다. 테이블의 컬럼과 일치합니다.
Primary Key: 각 엔티티의 주요 식별자를 나타냅니다. 주로 밑줄이나 굵은 선으로 표시됩니다.
Foreign Key: 다른 테이블과의 관계를 맺는 열을 나타냅니다. 이는 다른 테이블의 Primary Key와 연결됩니다.
아래는 myCalendar 프로젝트를 위해 작성한 간단한 ERD와 해당 ERD를 바탕으로 생성한 Table의 예시입니다.

CREATE TABLE `user` (
`id` bigint(20) NOT NULL,
`share_code` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`nickname` varchar(100) NOT NULL,
`term` bit(1) NULL,
`email` varchar(255) NOT NULL,
`admin` bit(1) NULL,
`user_type` varchar(30) NULL,
`created` datetime NULL,
`updated` datetime NULL,
`deleted` datetime NULL
);
CREATE TABLE `friend` (
`id` bigint(20) NOT NULL,
`user` bigint(20) NOT NULL,
`friend` bigint(20) NULL,
`group` bigint(100) NOT NULL,
`created` datetime NULL,
`updated` datetime NULL,
`deleted` datetime NULL
);
CREATE TABLE `group` (
`id` bigint(20) NOT NULL,
`color` varchar(8) NULL,
`name` varchar(100) NULL,
`created` datetime NULL,
`updated` datetime NULL,
`deleted` datetime NULL
);
CREATE TABLE `schedule` (
`id` bigint(20) NOT NULL,
`user` bigint(20) NOT NULL,
`custom_category` bigint(20) NOT NULL,
`location` bigint(20) NOT NULL,
`title` varchar(100) NULL,
`content` text NULL,
`startDate` datetime NULL,
`endDate` datetime NULL,
`created` datetime NULL,
`updated` datetime NULL,
`deleted` datetime NULL
);
CREATE TABLE `custom_category` (
`id` bigint(20) NOT NULL,
`user` bigint(20) NOT NULL,
`color` varchar(8) NULL,
`title` varchar(100) NULL,
`type` varchar(30) NULL,
`private` bit(1) NULL,
`created` datetime NULL,
`updated` datetime NULL,
`deleted` datetime NULL
);
CREATE TABLE `album` (
`id` bigint(20) NOT NULL,
`user` bigint(20) NOT NULL,
`file` varchar(255) NULL,
`type` varchar(30) NULL,
`date` datetime NULL,
`created` datetime NULL,
`updated` datetime NULL,
`deleted` datetime NULL
);
CREATE TABLE `location` (
`id` bigint(20) NOT NULL,
`schedule` bigint(20) NOT NULL,
`latitude` decimal(18, 10) NULL,
`longitude` decimal(18, 10) NULL,
`icon` varchar(255) NULL,
`created` datetime NULL,
`updated` datetime NULL,
`deleted` datetime NULL
);
ALTER TABLE `user` ADD CONSTRAINT `PK_USER` PRIMARY KEY (
`id`
);
ALTER TABLE `friend` ADD CONSTRAINT `PK_FRIEND` PRIMARY KEY (
`id`
);
ALTER TABLE `group` ADD CONSTRAINT `PK_GROUP` PRIMARY KEY (
`id`
);
ALTER TABLE `schedule` ADD CONSTRAINT `PK_SCHEDULE` PRIMARY KEY (
`id`
);
ALTER TABLE `custom_category` ADD CONSTRAINT `PK_CUSTOM_CATEGORY` PRIMARY KEY (
`id`
);
ALTER TABLE `album` ADD CONSTRAINT `PK_ALBUM` PRIMARY KEY (
`id`
);
ALTER TABLE `location` ADD CONSTRAINT `PK_LOCATION` PRIMARY KEY (
`id`
);
ALTER TABLE `friend` ADD CONSTRAINT `FK_user_TO_friend` FOREIGN KEY (
`user`
);
ALTER TABLE `friend` ADD CONSTRAINT `FK_group_TO_friend` FOREIGN KEY (
`group`
);
ALTER TABLE `schedule` ADD CONSTRAINT `FK_user_TO_schedule` FOREIGN KEY (
`user`
);
ALTER TABLE `schedule` ADD CONSTRAINT `FK_custom_category_TO_schedule` FOREIGN KEY (
`custom_category`
);
ALTER TABLE `schedule` ADD CONSTRAINT `FK_location_TO_schedule` FOREIGN KEY (
`location`
);
ALTER TABLE `custom_category` ADD CONSTRAINT `FK_user_TO_custom_category` FOREIGN KEY (
`user`
);
ALTER TABLE `album` ADD CONSTRAINT `FK_user_TO_album` FOREIGN KEY (
`user`
);
ALTER TABLE `location` ADD CONSTRAINT `FK_schedule_TO_location` FOREIGN KEY (
`schedule`
);
데이터베이스 설계 과정에서 정규화는 중요한 단계입니다. 정규화는 중복을 제거하고 데이터 일관성을 보장하기 위해 테이블을 분리하는 과정으로, 주로 1차 정규형, 2차 정규형, 3차 정규형, BCNF 등의 단계로 진행됩니다.
1차 정규형: 테이블의 컬럼이 모두 원자 값(Atomic Value)을 가지고 중복이 없어야 합니다.
2차 정규형: 1차 정규형을 만족하고, 부분적 함수 종속을 제거합니다.
3차 정규형: 2차 정규형을 만족하고, 이행적 함수 종속을 제거합니다.
BCNF (Boyce-Codd 정규형): 모든 결정자가 후보 키여야 합니다.
정규화를 통해 데이터 중복을 최소화하고 효율적인 데이터 구조를 설계할 수 있습니다. 이번 데이터베이스 설계 같은 경우 기존에 학교에서 정답이 있는 테이블 설계가 아닌 처음부터 혼자서 서비스에 들어갈 기능을 생각하면서 새롭게 테이블을 정의하여 많이 부족하지만 앞으로 위와 같이 배워나갈 예정입니다.
다음 일차에서는 Spring Boot와 데이터베이스를 연결하여 로그인과 회원가입 기능을 만들어보고자 합니다. 데이터베이스 테이블 설계를 바탕으로 정확한 데이터의 저장과 조회를 구현하여 사용자들에게 더욱 편리한 서비스를 제공할 수 있도록 노력하겠습니다.
데이터베이스 설계와 정규화에 대한 배움을 토대로 더욱 효율적인 myCalendar 프로젝트를 개발해나가기 위해 노력하겠습니다. 감사합니다!