docs: add recommendation architecture document

This commit is contained in:
2026-06-04 16:09:53 +02:00
committed by Milas Holsting
parent 32d7301788
commit fcdfd0a623
2 changed files with 241 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
-- +goose Up
CREATE TABLE IF NOT EXISTS recommendation_event (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
anime_id INTEGER,
event_type TEXT NOT NULL,
source TEXT,
metadata_json TEXT,
occurred_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(user_id) REFERENCES user(id) ON DELETE CASCADE,
FOREIGN KEY(anime_id) REFERENCES anime(id) ON DELETE SET NULL
);
CREATE INDEX IF NOT EXISTS idx_recommendation_event_user_occurred_at
ON recommendation_event(user_id, occurred_at DESC);
CREATE INDEX IF NOT EXISTS idx_recommendation_event_user_event_type_occurred_at
ON recommendation_event(user_id, event_type, occurred_at DESC);
CREATE INDEX IF NOT EXISTS idx_recommendation_event_anime_occurred_at
ON recommendation_event(anime_id, occurred_at DESC);
CREATE TABLE IF NOT EXISTS recommendation_impression (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
anime_id INTEGER NOT NULL,
rail TEXT NOT NULL,
position INTEGER NOT NULL,
request_id TEXT,
metadata_json TEXT,
occurred_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(user_id) REFERENCES user(id) ON DELETE CASCADE,
FOREIGN KEY(anime_id) REFERENCES anime(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_recommendation_impression_user_occurred_at
ON recommendation_impression(user_id, occurred_at DESC);
CREATE INDEX IF NOT EXISTS idx_recommendation_impression_request_id
ON recommendation_impression(request_id);
CREATE TABLE IF NOT EXISTS recommendation_profile_snapshot (
user_id TEXT PRIMARY KEY,
profile_json TEXT NOT NULL,
source_window_start DATETIME,
source_window_end DATETIME,
computed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(user_id) REFERENCES user(id) ON DELETE CASCADE
);
-- +goose Down
DROP TABLE IF EXISTS recommendation_profile_snapshot;
DROP INDEX IF EXISTS idx_recommendation_impression_request_id;
DROP INDEX IF EXISTS idx_recommendation_impression_user_occurred_at;
DROP TABLE IF EXISTS recommendation_impression;
DROP INDEX IF EXISTS idx_recommendation_event_anime_occurred_at;
DROP INDEX IF EXISTS idx_recommendation_event_user_event_type_occurred_at;
DROP INDEX IF EXISTS idx_recommendation_event_user_occurred_at;
DROP TABLE IF EXISTS recommendation_event;