- spring boot 2.3.2
- mysql 8.0.21 for osx10.15 on x86_64 (Homebrew)
- 데이터 저장 계층 jpa, hibernate
- 빌드 gradle
구현해 볼 기능을 쭉 정리해보면 크게 4가지이다.
- 회원은 글/댓글/강의평가/시간표를 생성할 수 있다.
- 글과 댓글에는 여러 종류의 사진을 선택하여 넣을 수 있다.
- 시간표에는 여러 강의를 선택하여 넣을 수 있다.
연관 관계를 알아보면,
- 회원-글/시간표/강평/댓글: 일대 다 관계
- 글-댓글: 일대 다 관계
- 글/댓글-사진: 일대 다 관계
- 강의-강의평가: 일대 다 관계
- 시간표-강의:다대 다 관계
- 시간표에 다른 강의 여러개 넣을 수 있고
- 같은 강의가 여러 시간표에 들어갈 수 있다
- --> 다대 다 관계는 관계형 데이터베이스 뿐만 아니라 엔티티에서도 거의 사용하지 않는다고 함
- --> 따라서 연결 엔티티 강의시간표를 추가해서 일대다 관계+다대일 관계로 만들도록 한다.
- 강의 시간표에는 담은 강의의 학점 합도 포함하도록 한다.
- 추가) 즐겨찾기의 경우도 다대다 관계이므로 관계를 쪼개도록 한다.
위 관계를 기반으로 엔티티의 관계를 그려보면
- 회원 기능
- 회원 등록
- 게시판 기능
- 글 등록
- 글 조회
- 댓글 등록
- 공감/비공감
- 즐겨찾기
- 시간표 기능
- 시간표 만들기
- 시간표 조회
- 강의평가 기능
- 강의평가 등록
- 강의평가 조회
- 강의평가 검색
DB에 저장해야 할 정보 목록
- User(회원)
- id
- user_id
- user_pwd
- name
- nickname
- is_verified
- level
- files
- Board(글)
- id
- time
- views
- title
- contents
- user_id
- upvote
- downvote
- Favorite(즐겨찾기)
- user_id
- board_id
- Comments(댓글)
- id
- user_id
- board_id
- contents
- upvote
- downvote
- Lecture(강의)
- id
- professor
- lecture_name
- lecture_numbers
- semester
- department
- credit
- Lecture_Evaluation(강의 평가)
- id
- lecture_id
- professor
- content
- evaluate
- evaluate_credit
- evaluate_assignment
- evaluate_teamproject
- evaluate_attendance
- evaluate_testlevel
- evaluate_testcategory
- Schedule(시간표)
- id
- user_id
- lecture_id
- credits
정규화 후 DB Schema
데이터베이스 정규화는 어디까지 진행해야하는지 잘 모르겠다...
정규화/반정규화는 모든 기본화면에 해당 항목이 함께 조회되어야 하느냐 아니냐에 따라 결정하면 된다고 하는데,
일단 사용자가 필요로 하는지, 그냥 시스템적으로만 필요한 것인지 나눠서 생각해보고
테이블 조인을 할지 아니면 한 테이블에 모두 저장을 할지 결정해야 할 것 같다.
일단은 아래와 같이 정규화 해 보았다. 하다가 바뀔수도 있음...
CREATE DATABASE ewhaianDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE ewhaianDB;
CREATE TABLE IF NOT EXISTS Users (
id varchar(40) primary key,
u_id varchar(40) not null,
u_password varchar(40) not null,
email varchar(40) not null,
name varchar(20) not null,
nickname varchar(20) not null,
is_verified binary not null,
level integer not null
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS UploadedFiles (
id varchar(40) primary key,
user_id varchar(40) not null,
image_file blob not null,
time datetime not null,
foreign key(user_id) references Users(id)
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS Board (
id integer primary key,
user_id varchar(40) not null,
views integer default 0,
title varchar(100) not null,
content text not null,
upvote integer default 0,
downvote integer default 0,
file_id varchar(40),
time DateTime not null,
foreign key(user_id) references Users(id),
foreign key(file_id) references UploadedFiles(id)
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS Comments (
id integer primary key,
user_id varchar(40) not null,
board_id integer not null,
depth integer default 0,
contents text not null,
upvote integer default 0,
downvote integer default 0,
file_id varchar(40),
time datetime not null,
foreign key(user_id) references Users(id),
foreign key(board_id) references Board(id),
foreign key(file_id) references UploadedFiles(id)
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS Schedule_Time (
id varchar(40) primary key,
time varchar(20) not null
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS Professors (
id varchar(40) primary key,
name varchar(30) not null
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS Departments (
id varchar(40) primary key,
name varchar(30) not null
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS Lectures (
id varchar(40) primary key,
department_id varchar(40) not null,
name varchar(30) not null,
credit float4 not null,
lecture_code varchar(10),
foreign key(department_id) references Departments(id)
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS Lecture_Held (
id varchar(40) primary key,
lecture_id varchar(40) not null,
lecture_division integer default 1,
professor_id varchar(40) not null,
semester varchar(10) not null,
lecture_place varchar(40),
lecture_time varchar(40),
foreign key(lecture_id) references Lectures(id),
foreign key(professor_id) references Professors(id),
foreign key(lecture_time) references Schedule_Time(id)
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS Schedule (
id varchar(40) primary key,
user_id varchar(40) not null,
lecture_id varchar(40) not null,
priority integer default 0,
foreign key(user_id) references Users(id),
foreign key(lecture_id) references Lecture_Held(id)
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS Lecture_Evaluation (
id varchar(40) primary key,
lecture_id varchar(40) not null,
user_id varchar(40) not null,
contents text not null,
evaluate integer not null,
evaluate_credit integer,
evaluate_assignment integer,
evaluate_teamproject integer,
evaluate_attendance integer,
evaluate_testlevel integer,
evaluate_tests integer,
time datetime not null,
foreign key(lecture_id) references Lecture_Held(id),
foreign key(user_id) references Users(id)
) CHARSET=utf8;
https://github.com/sypark9646/ewhaian-clone-project
sypark9646/ewhaian-clone-project
Contribute to sypark9646/ewhaian-clone-project development by creating an account on GitHub.
github.com
'프로젝트' 카테고리의 다른 글
항공 규정 번역 시스템 (0) | 2020.07.11 |
---|---|
Emotion Analyze Speaker (0) | 2020.07.10 |