유튜브 클론코딩(7)
요약
- init.sql 작성
init.sql (테이블 초기화, 트리거 설정 등)
기존에 ALTER로 처리한 내용들을 CREATE TABLE에 모두 수정했다.
깃허브에 올린 파일
CREATE TABLE website_user (
user_id serial PRIMARY KEY,
user_name varchar(50) NOT NULL,
email text NOT NULL,
password_hash text NOT NULL,
is_authorized boolean NOT NULL,
created_at timestamp NOT NULL DEFAULT now(),
updated_at timestamp NOT NULL DEFAULT now()
);
CREATE TABLE channel (
channel_id serial PRIMARY KEY,
user_id integer NOT NULL REFERENCES website_user(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
channel_name varchar(50) NOT NULL,
updated_at timestamp NOT NULL DEFAULT now()
);
CREATE TABLE video_type (
video_type_id smallserial PRIMARY KEY,
video_type_text varchar(10) NOT NULL
);
INSERT INTO video_type (video_type_text) VALUES ('original');
INSERT INTO video_type (video_type_text) VALUES ('shorts');
CREATE DOMAIN positive_bigint AS bigint CHECK (VALUE >= 0);
CREATE TABLE video (
video_id serial PRIMARY KEY,
channel_id integer NOT NULL REFERENCES channel(channel_id) ON DELETE CASCADE ON UPDATE CASCADE,
source text NOT NULL,
views positive_bigint NOT NULL DEFAULT 0,
description text NOT NULL,
created_at timestamp NOT NULL DEFAULT now(),
updated_at timestamp NOT NULL DEFAULT now(),
video_type_id smallint NOT NULL REFERENCES video_type(video_type_id)
);
CREATE TABLE post (
post_id serial PRIMARY KEY,
channel_id integer NOT NULL REFERENCES channel(channel_id) ON UPDATE CASCADE ON DELETE CASCADE,
content_text text NOT NULL,
created_at timestamp NOT NULL DEFAULT now(),
updated_at timestamp NOT NULL DEFAULT now()
);
CREATE TABLE comment (
comment_id serial PRIMARY KEY,
channel_id integer NOT NULL REFERENCES channel(channel_id) ON DELETE CASCADE ON UPDATE CASCADE,
parent_comment_id integer REFERENCES comment(comment_id) ON DELETE CASCADE ON UPDATE CASCADE,
content_text text NOT NULL,
created_at timestamp NOT NULL DEFAULT now(),
updated_at timestamp NOT NULL DEFAULT now()
);
CREATE TABLE image (
image_id serial PRIMARY KEY,
source text NOT NULL,
created_at timestamp NOT NULL DEFAULT now(),
updated_at timestamp NOT NULL DEFAULT now()
);
CREATE TABLE Channel_Subscriber (
subscribed_channel_id integer NOT NULL REFERENCES channel(channel_id) ON DELETE CASCADE ON UPDATE CASCADE,
subscriber_channel_id integer NOT NULL REFERENCES channel(channel_id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE video_likes (
channel_id integer NOT NULL REFERENCES channel(channel_id) ON DELETE CASCADE ON UPDATE CASCADE,
video_id integer NOT NULL REFERENCES video(video_id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE video_dislikes (
channel_id integer NOT NULL REFERENCES channel(channel_id) ON DELETE CASCADE ON UPDATE CASCADE,
video_id integer NOT NULL REFERENCES video(video_id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE post_likes (
channel_id integer NOT NULL REFERENCES channel(channel_id) ON DELETE CASCADE ON UPDATE CASCADE,
post_id integer NOT NULL REFERENCES post(post_id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE post_dislikes (
channel_id integer NOT NULL REFERENCES channel(channel_id) ON DELETE CASCADE ON UPDATE CASCADE,
post_id integer NOT NULL REFERENCES post(post_id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE comment_likes (
channel_id integer NOT NULL REFERENCES channel(channel_id) ON DELETE CASCADE ON UPDATE CASCADE,
comment_id integer NOT NULL REFERENCES comment(comment_id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE comment_dislikes (
channel_id integer NOT NULL REFERENCES channel(channel_id) ON DELETE CASCADE ON UPDATE CASCADE,
comment_id integer NOT NULL REFERENCES comment(comment_id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE Video_Comment (
video_id integer NOT NULL REFERENCES video(video_id) ON DELETE CASCADE ON UPDATE CASCADE,
comment_id integer NOT NULL REFERENCES comment(comment_id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE post_comment (
post_id integer NOT NULL REFERENCES post(post_id) ON DELETE CASCADE ON UPDATE CASCADE,
comment_id integer NOT NULL REFERENCES comment(comment_id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE post_image (
post_id integer NOT NULL REFERENCES post(post_id) ON DELETE CASCADE ON UPDATE CASCADE,
image_id integer NOT NULL REFERENCES image(image_id) ON DELETE CASCADE ON UPDATE CASCADE
);
-- Functions
CREATE FUNCTION update_created_at() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
NEW.created_at := now();
ELSE
NEW.created_at := OLD.created_at;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION update_updated_at() RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at := now();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Triggers
CREATE TRIGGER update_created_at_trigger
BEFORE INSERT OR UPDATE ON website_user FOR EACH ROW EXECUTE PROCEDURE update_created_at();
CREATE TRIGGER update_created_at_trigger
BEFORE INSERT OR UPDATE ON video FOR EACH ROW EXECUTE PROCEDURE update_created_at();
CREATE TRIGGER update_created_at_trigger
BEFORE INSERT OR UPDATE ON post FOR EACH ROW EXECUTE PROCEDURE update_created_at();
CREATE TRIGGER update_created_at_trigger
BEFORE INSERT OR UPDATE ON comment FOR EACH ROW EXECUTE PROCEDURE update_created_at();
CREATE TRIGGER update_created_at_trigger
BEFORE INSERT OR UPDATE ON image FOR EACH ROW EXECUTE PROCEDURE update_created_at();
CREATE TRIGGER update_updated_at_trigger
BEFORE UPDATE ON website_user FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
CREATE TRIGGER update_updated_at_trigger
BEFORE UPDATE ON channel FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
CREATE TRIGGER update_updated_at_trigger
BEFORE UPDATE ON video FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
CREATE TRIGGER update_updated_at_trigger
BEFORE UPDATE ON post FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
CREATE TRIGGER update_updated_at_trigger
BEFORE UPDATE ON comment FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
CREATE TRIGGER update_updated_at_trigger
BEFORE UPDATE ON image FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
마지막
앞으로 할 것들 (진행 과정 중)
() 괄호 안 숫자는 우선순위
- 드디어 node.js + express + typescript 백엔드 출발
앞으로 할 것들 (진행 과정 이후)
- Polymorphic Associations 디자인 사용해서 이쁘게 구조 변경
댓글남기기