CREATE TABLE Users ( -- @TODO check: 예약어 충돌 방지를 위해 User->Users 로 변경 id BIGINT PRIMARY KEY AUTO_INCREMENT, password VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, user_name VARCHAR(30) NOT NULL, -- used as nickname user_role enum('USER','ADMIN') NOT NULL DEFAULT 'USER', is_premium BOOLEAN DEFAULT FALSE, last_login TIMESTAMP DEFAULT NULL, is_active enum('active','waiting','blocked','suspend','delete') NOT NULL DEFAULT 'waiting'); -- User 와 1:N 카디널리티 적용 -- Role : User has Diary (1:N) -- @TODO 제약조건: 사용자가 일기 다 지우기 전까지 계정 탈퇴 못함 CREATE TABLE Diary ( id BIGINT AUTO_INCREMENT, user_id BIGINT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, title VARCHAR(255), content TEXT NOT NULL, alternative_thought TEXT, PRIMARY KEY (id), -- @TODO 검토 필요 : indexing 설정하기 FOREIGN KEY (user_id) REFERENCES Users(id) ON DELETE RESTRICT ON UPDATE CASCADE -- @TODO 검토 필요 : 일기 지우기 전까지 탈퇴 불가능 ); -- Diary 와 1:1 카디널리티 적용 CREATE TABLE Diary_Answer ( id BIGINT PRIMARY KEY AUTO_INCREMENT, diary_id BIGINT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, emotion_detection TEXT, DEFAULT NULL, -- 감정 분석 결과 automatic_thought TEXT, DEFAULT NULL, -- 자동적 사고 prompt_for_change TEXT, DEFAULT NULL, -- 사고 전환을 위한 프롬프트 alternative_thought TEXT, DEFAULT NULL, -- 대안적 사고 status enum ('positive', 'negative', 'neutral') NOT NULL DEFAULT 'neutral', FOREIGN KEY (diary_id) REFERENCES Diary(id) ON DELETE CASCADE ON UPDATE CASCADE ); -- 기본 설정 템플릿 생성 -- @TODO 검토 필요 CREATE TABLE Settings_option ( id INT AUTO_INCREMENT, setting_key VARCHAR(50) NOT NULL UNIQUE, default_value TEXT NOT NULL, data_type ENUM('STRING', 'NUMBER', 'BOOLEAN', 'JSON') NOT NULL, description VARCHAR(100), is_user_editable BOOLEAN DEFAULT TRUE, PRIMARY KEY (id) ); -- USER custom option -> 약성 개체 집합으로 의존성 부여 -- 유저 정보나 설정 정보 변경시 validation 제약 -- @TODO 검토 필요 CREATE TABLE User_custom_setting ( user_id BIGINT NOT NULL, setting_id INT NOT NULL, override_value TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (user_id, setting_id), -- @TODO 초기 로그인 때 토큰에 넣으면 될 듯 (user_id, setting_id) FOREIGN KEY (user_id) REFERENCES Users(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (setting_id) REFERENCES Settings_option(id) ON DELETE CASCADE ON UPDATE CASCADE ); -- 로그인 관련 --> 실질적으로는 중복 계정 필터링 역할로만 사용 예정 -- 인증 공급자 릴레이션 CREATE TABLE Auth_Provider ( id INT AUTO_INCREMENT, provider_name VARCHAR(50) NOT NULL DEFAULT 'SERVER', -- @TODO 기본 제공자는 SERVER description VARCHAR(255), is_active BOOLEAN DEFAULT TRUE, PRIMARY KEY (id) ); -- 사용자 인증 정보 릴레이션 CREATE TABLE User_Authentication ( user_id BIGINT NOT NULL, auth_provider_id INT NOT NULL, social_id VARCHAR(255) NOT NULL, -- Provider 제공 고유 id, 로컬 서버시에는 UUID 값 email VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (user_id, auth_provider_id, social_id), FOREIGN KEY (user_id) REFERENCES Users(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (auth_provider_id) REFERENCES Auth_Provider(id) ON DELETE RESTRICT ON UPDATE CASCADE, UNIQUE (auth_provider_id, social_id) ); -- @ 인덱스 - start --------------------------------------------------------------- -- @ 인덱스 - end ---------------------------------------------------------------