-- 298_study_reminders.sql -- 알람 재료 append-only 원장. study_reminder cron(09/13/19 KST)이 발화 시 1행 INSERT, -- GET /reminders/latest 가 읽는다. UPDATE/DELETE 없음. -- fired_at 은 발화 시각의 '시간 슬롯' 으로 truncate 해서 박는다 (raw now() 마이크로초면 -- UNIQUE 가 사실상 안 걸려 멱등 무효). UNIQUE(user_id, fired_at) + on_conflict_do_nothing. -- study_topic_id ON DELETE SET NULL: 토픽 삭제돼도 과거 알람 이력 보존(CASCADE 아님). CREATE TABLE IF NOT EXISTS study_reminders ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, study_topic_id BIGINT REFERENCES study_topics(id) ON DELETE SET NULL, due_count INTEGER, focus_topic_names JSONB, fired_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), CONSTRAINT uq_study_reminders_user_fired UNIQUE (user_id, fired_at) );