컴퓨터는 잘못이 없다..

[Every Book Day]DB설계 본문

카테고리 없음

[Every Book Day]DB설계

도토리까꿍v 2021. 3. 31. 14:05
Contents 접기

#Table 

개인정보를 저장하는 users 테이블

게시글 정보를 저장하는 게시글 테이블 

게시글의 하트 정보를 저장하는 하트(heart) 테이블

게시글의 댓글 정보를 저장하는 댓글(cmt) 테이블(wording제외)

 

 

#DB설계 시 고려한 점 

 

1. Foreign key와 ON DELETE CASCADE옵션

▶모든 게시글(report, market, episode, wording, file) 테이블과 관련 하트 테이블에 foreign key와 ON DELETE CASCADE 옵션을 줌

 

▶모든 게시글 테이블의 writer을 ebd_users테이블의 nick을 참조하는 foreign key로 지정함

   ┖유저가 탈퇴 시 그 유저가 남긴 게시글이 삭제되도록 만드는 효과 

 

▶모든 하트 테이블의 writer을 ebd_users테이블의 nick을 참조하는 foreign key로 지정함

   ┖유저가 탈퇴 시 그 유저가 클릭한 하트 정보가 사라지는 효과 

 

▶모든 하트 테이블의 target_num은 관련 게시글 테이블의 num을 참조하는 foreign key로 지정함 

   ┖게시글이 삭제되었을 때 그 게시글에 눌린 하트 정보가 사라지는 효과 

 

 

2. Trigger

▶ ebd_users테이블의 해당 nick 의 row가 삭제되었을 때 모든 댓글 테이블의 deleted여부가 no에서 yes로 수정 되도록 함

  ┖유저가 탈퇴 시 댓글이 '삭제된 댓글입니다' 로 바뀌는 효과

▶ ebd_users테이블의 해당 nick의 row가 수정되었을 때 모든 게시글 테이블, 하트 테이블, 댓글 테이블의 nick이 수정되도록 함

  ┖유저가 닉네임을 변경했을 시 모든 테이블의 닉네임 정보가 update되는 효과 

 

 

3. 그 외..

1,2번과 CHECK 제약조건, DEFAULT제약조건을 통해 데이터 무결성을 지키려 노력하였음

 

 

#Table & Sequence 

-- 도서리뷰 회원 테이블
CREATE TABLE ebd_users(
	id VARCHAR2(100) PRIMARY KEY, --아이디
	pwd VARCHAR2(100) NOT NULL, --비밀번호
	name VARCHAR2(100),  --이름
	nick VARCHAR2(100) NOT NULL, --닉네임
	gender VARCHAR2(10), --성별
	birth_year VARCHAR2(10), --생년
	birth_month VARCHAR2(10), --월
	birth_day VARCHAR2(10), --일 
	email VARCHAR2(100), --이메일
	phone VARCHAR2(100), --핸드폰 
	profile VARCHAR2(2000), --프로필 이미지
	regdate DATE, --등록일
	CONSTRAINT users_nick_uk UNIQUE(nick), -- 닉네임은 유일해야한다. 
	CONSTRAINT users_gender_ck CHECK(gender IN('남','여')) --남자일 경우 '남자', 여자일 경우 '여자'가 들어간다.
);


-- 독후감 테이블 
CREATE TABLE ebd_report(  
	num NUMBER PRIMARY KEY, --글 번호
	booktitle VARCHAR2(2000), --책 제목
	title VARCHAR2(2000), --글 제목 
	writer VARCHAR2(100), --작성자(닉네임) / join 연결고리
	author VARCHAR2(2000), --책 저자
	link VARCHAR2(2000), -- 구매처 링크
	genre VARCHAR2(100), --책 장르
	stars VARCHAR2(50), --평점
	imgpath VARCHAR2(2000), --이미지
	content CLOB, --내용
	publicck VARCHAR2(50) DEFAULT 'private', --공개/비공개 여부 / DEFAULT 'private'
	viewcnt NUMBER, --조회수
	regdate DATE, --등록일
	CONSTRAINT r_writer_fk FOREIGN KEY(writer) REFERENCES ebd_users(nick) ON DELETE CASCADE --지우지마세영~
);

-- 독후감 테이블 시퀀스
CREATE SEQUENCE ebd_report_seq;

-- 독후감 댓글 테이블
CREATE TABLE ebd_report_cmt(
	num NUMBER PRIMARY KEY, --글 번호
	writer VARCHAR2(100), --작성자
	content VARCHAR2(500), --댓글 내용
	target_nick VARCHAR2(100), --답댓글 달 대상자 아이디
	ref_group NUMBER, -- 원글(거래 글)의 글 번호 
	cmt_group NUMBER, -- 댓글의 그룹번호
	deleted CHAR(3) DEFAULT 'no', --삭제된 댓글인지의 여부
	regdate DATE --댓글 작성일
);

-- 독후감 댓글의 글번호를 얻어낼 시퀀스
CREATE SEQUENCE ebd_report_cmt_seq;

CREATE TABLE ebd_report_heart(
	num NUMBER PRIMARY KEY,
	target_num NUMBER,
	writer VARCHAR2(100),
	CONSTRAINT rh_writer_fk FOREIGN KEY(writer) REFERENCES ebd_users(nick) ON DELETE CASCADE, --지우지마세영~
	CONSTRAINT rh_num_fk FOREIGN KEY(target_num) REFERENCES ebd_report(num) ON DELETE CASCADE
);

CREATE SEQUENCE ebd_report_heart_seq;

-- 도서 에피소드 테이블
CREATE TABLE ebd_episode(
	num NUMBER PRIMARY KEY, --글 번호
	writer VARCHAR2(100), --작성자(로그인 된 아이디)
	title VARCHAR2(2000), --제목
	imgpath VARCHAR2(2000), --이미지
	content CLOB, --내용
	viewcnt NUMBER, --조회수
	regdate DATE, --등록일
	CONSTRAINT e_writer_fk FOREIGN KEY(writer) REFERENCES ebd_users(nick) ON DELETE CASCADE --지우지마세영~
);

-- 도서 에피소드 테이블 시퀀스
CREATE SEQUENCE ebd_episode_seq;

-- 독후감 댓글 테이블
CREATE TABLE ebd_episode_cmt(
	num NUMBER PRIMARY KEY, --글 번호
	writer VARCHAR2(100), --작성자
	content VARCHAR2(500), --댓글 내용
	target_nick VARCHAR2(100), --답댓글 달 대상자 아이디
	ref_group NUMBER, -- 원글(거래 글)의 글 번호 
	cmt_group NUMBER, -- 댓글의 그룹번호
	deleted CHAR(3) DEFAULT 'no', --삭제된 댓글인지의 여부
	regdate DATE --댓글 작성일 
);

-- 독후감 댓글의 글번호를 얻어낼 시퀀스
CREATE SEQUENCE ebd_episode_cmt_seq;

CREATE TABLE ebd_episode_heart(
	num NUMBER PRIMARY KEY,
	target_num NUMBER,
	writer VARCHAR2(100),
	CONSTRAINT eh_writer_fk FOREIGN KEY(writer) REFERENCES ebd_users(nick) ON DELETE CASCADE, --지우지마세영~
	CONSTRAINT eh_num_fk FOREIGN KEY(target_num) REFERENCES ebd_episode(num) ON DELETE CASCADE
);

CREATE SEQUENCE ebd_episode_heart_seq;

-- 명언 테이블 (명언 테이블에는 viewcnt가 없다.)
CREATE TABLE ebd_wording(
	num NUMBER PRIMARY KEY, --글 번호
	writer VARCHAR2(100), --작성자(로그인 된 아이디)
	title VARCHAR2(2000), --책 제목
	content CLOB, -- 내용(명언)
	author VARCHAR2(2000), --책의 작가 
	regdate DATE, --등록일
	CONSTRAINT w_writer_fk FOREIGN KEY(writer) REFERENCES ebd_users(nick) ON DELETE CASCADE --지우지마세영~
);

-- 명언 테이블 시퀀스
CREATE SEQUENCE ebd_wording_seq;


CREATE TABLE ebd_wording_heart(
	num NUMBER PRIMARY KEY,
	target_num NUMBER, --글의 번호
	writer VARCHAR2(100), --좋아요 누른 사람
	CONSTRAINT wh_writer_fk FOREIGN KEY(writer) REFERENCES ebd_users(nick) ON DELETE CASCADE, --지우지마세영~
	CONSTRAINT wh_num_fk FOREIGN KEY(target_num) REFERENCES ebd_wording(num) ON DELETE CASCADE --지우지마세영~
);

CREATE SEQUENCE ebd_wording_heart_seq;

-- 도서 거래 테이블
CREATE TABLE ebd_market(
	num NUMBER PRIMARY KEY, --글 번호
	writer VARCHAR2(100), --작성자(로그인 된 아이디)
	title VARCHAR2(2000), --제목
	salestype VARCHAR2(50), --판매유형 나눔/교환/판매
	salesstatus VARCHAR2(50), --판매상태 판매중/완료
	imgpath VARCHAR2(2000), --이미지 파일
	content CLOB, --내용
	viewcnt NUMBER, --조회수
	regdate DATE, --등록일
	CONSTRAINT m_writer_fk FOREIGN KEY(writer) REFERENCES ebd_users(nick) ON DELETE CASCADE --지우지마세영~
);

-- 도서 거래 테이블 시퀀스
CREATE SEQUENCE ebd_market_seq;

--도서 거래 하트 테이블
CREATE TABLE ebd_market_heart(
	num NUMBER PRIMARY KEY,
	target_num NUMBER,
	writer VARCHAR2(100),
	CONSTRAINT mh_writer_fk FOREIGN KEY(writer) REFERENCES ebd_users(nick) ON DELETE CASCADE, --지우지마세영~
	CONSTRAINT mh_num_fk FOREIGN KEY(target_num) REFERENCES ebd_market(num) ON DELETE CASCADE
);

--도서 거래 하트 시퀀스 
CREATE SEQUENCE ebd_market_heart_seq;


-- 도서 거래 댓글 테이블
CREATE TABLE ebd_market_cmt(
	num NUMBER PRIMARY KEY, --글 번호
	writer VARCHAR2(100), --작성자
	content VARCHAR2(500), --댓글 내용
	target_nick VARCHAR2(100), --답댓글 달 대상자 아이디
	ref_group NUMBER, -- 원글(거래 글)의 글 번호 
	cmt_group NUMBER, -- 댓글의 그룹번호
	deleted CHAR(3) DEFAULT 'no', --삭제된 댓글인지의 여부
	regdate DATE --댓글 작성일
);

-- 도서 거래 댓글의 글번호를 얻어낼 시퀀스
CREATE SEQUENCE ebd_market_cmt_seq;

-- 독후감 양식 파일 업로드 테이블
CREATE TABLE ebd_file(
	num NUMBER PRIMARY KEY, --글 번호
	writer VARCHAR2(100), --작성자(로그인 된 아이디의 닉네임)
	title VARCHAR2(2000), --제목
	orgfname VARCHAR2(2000), --파일명
	savefname VARCHAR2(2000), --파일명
	filesize NUMBER,--파일 사이즈
	imgpath VARCHAR2(2000), --이미지 파일
	content CLOB, --내용
	viewcnt NUMBER, --조회수
	regdate DATE, --등록일
	CONSTRAINT f_writer_fk FOREIGN KEY(writer) REFERENCES ebd_users(nick) ON DELETE CASCADE 
);

-- 독후감 양식 파일 업로드 테이블 시퀀스
CREATE SEQUENCE ebd_file_seq;

-- 독후감 양식 파일 업로드 댓글 테이블
CREATE TABLE ebd_file_cmt(
	num NUMBER PRIMARY KEY, --글 번호
	writer VARCHAR2(100), --작성자
	content VARCHAR2(500), --댓글 내용
	target_nick VARCHAR2(100), --답댓글 달 대상자 아이디
	ref_group NUMBER, -- 원글(거래 글)의 글 번호 
	cmt_group NUMBER, -- 댓글의 그룹번호
	deleted CHAR(3) DEFAULT 'no', --삭제된 댓글인지의 여부
	regdate DATE --댓글 작성일 
);

-- 독후감 양식 파일 업로드 댓글의 글번호를 얻어낼 시퀀스
CREATE SEQUENCE ebd_file_cmt_seq;


CREATE TABLE ebd_file_heart(
   num NUMBER PRIMARY KEY,
   target_num NUMBER, 
   writer VARCHAR2(100), 
   CONSTRAINT fh_writer_fk FOREIGN KEY(writer) REFERENCES ebd_users(nick) ON DELETE CASCADE, 
   CONSTRAINT fh_num_fk FOREIGN KEY(target_num) REFERENCES ebd_file(num) ON DELETE CASCADE
);

CREATE SEQUENCE ebd_file_heart_seq;

 

#Trigger

--user테이블의 nick이 update 되었을 때 발생하는 trigger
	CREATE TRIGGER tg_user_update
	AFTER UPDATE OF nick ON ebd_users FOR EACH ROW   
	BEGIN
					UPDATE ebd_report  
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick;
					
					UPDATE ebd_report_cmt 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick;
					
					UPDATE ebd_report_cmt 
	        SET target_nick = :NEW.nick
	        WHERE target_nick = :OLD.nick;
					
					UPDATE ebd_report_heart 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick;  
					
					UPDATE ebd_wording 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick; 
					
					UPDATE ebd_wording_heart 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick; 
					
					UPDATE ebd_episode 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick;  
					
					UPDATE ebd_episode_cmt 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick;
					
					UPDATE ebd_episode_cmt 
	        SET target_nick = :NEW.nick
	        WHERE target_nick = :OLD.nick; 
					
					UPDATE ebd_episode_heart 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick; 
					
					UPDATE ebd_file 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick;  
					
					UPDATE ebd_file_cmt 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick;
					
					UPDATE ebd_file_cmt 
	        SET target_nick = :NEW.nick
	        WHERE target_nick = :OLD.nick;

					UPDATE ebd_file_heart 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick; 
					
					UPDATE ebd_market 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick;
					
					UPDATE ebd_market_cmt 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick; 
					
					UPDATE ebd_market_cmt 
	        SET target_nick = :NEW.nick
	        WHERE target_nick = :OLD.nick; 
		
					UPDATE ebd_market_heart 
	        SET writer = :NEW.nick
	        WHERE writer = :OLD.nick;             
	    END;
	/


--user테이블의 행이 삭제되었을 때 발생하는 trigger 
CREATE TRIGGER tg_user_delete
    AFTER DELETE ON ebd_users FOR EACH ROW   
    BEGIN
				UPDATE ebd_report_cmt 
        SET deleted = 'yes'
        WHERE deleted = 'no' AND writer= :OLD.nick;  
				
				UPDATE ebd_episode_cmt 
        SET deleted = 'yes'
        WHERE deleted = 'no' AND writer= :OLD.nick;  
				
				UPDATE ebd_file_cmt 
        SET deleted = 'yes'
        WHERE deleted = 'no' AND writer= :OLD.nick;  
				
				UPDATE ebd_market_cmt 
        SET deleted = 'yes'
        WHERE deleted = 'no' AND writer= :OLD.nick;  
    END;
/
Comments