-- Per-user like/dislike reactions on mangas — a private taste signal that -- powers content-based recommendations. One row per (user, manga); the -- `reaction` column toggles between 'like' and 'dislike', and clearing a -- reaction deletes the row. Reactions are never exposed publicly (no counts). CREATE TABLE manga_reactions ( user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE, manga_id uuid NOT NULL REFERENCES mangas(id) ON DELETE CASCADE, reaction text NOT NULL CHECK (reaction IN ('like', 'dislike')), created_at timestamptz NOT NULL DEFAULT now(), PRIMARY KEY (user_id, manga_id) ); -- Recommendations aggregate a user's reacted mangas by tag; the PK covers -- per-user lookups, this covers the reverse (all reactions on a manga). CREATE INDEX manga_reactions_manga_idx ON manga_reactions (manga_id);