CREATE TABLE IF NOT EXISTS issues ( id BIGSERIAL PRIMARY KEY, title VARCHAR(255) NOT NULL, description TEXT, start_time TIMESTAMPTZ NOT NULL, end_time TIMESTAMPTZ NOT NULL, created TIMESTAMPTZ NOT NULL DEFAULT now(), version INT NOT NULL DEFAULT 1 ); CREATE TABLE IF NOT EXISTS options ( id BIGSERIAL PRIMARY KEY, issue_id BIGINT NOT NULL REFERENCES issues(id) ON DELETE CASCADE, label VARCHAR(255) NOT NULL, created TIMESTAMPTZ NOT NULL DEFAULT now(), version INT NOT NULL DEFAULT 1 ); CREATE TABLE IF NOT EXISTS vote_tokens ( id BIGSERIAL PRIMARY KEY, issue_id BIGINT NOT NULL REFERENCES issues(id) ON DELETE CASCADE, token UUID NOT NULL UNIQUE DEFAULT gen_random_uuid(), used BOOLEAN NOT NULL DEFAULT FALSE, created TIMESTAMPTZ NOT NULL DEFAULT now(), version INT NOT NULL DEFAULT 1 ); CREATE TABLE IF NOT EXISTS votes ( id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, token UUID NOT NULL UNIQUE REFERENCES vote_tokens(token) ON DELETE CASCADE, option_id BIGINT NOT NULL REFERENCES options(id) ON DELETE CASCADE, created TIMESTAMPTZ NOT NULL DEFAULT now(), version INT NOT NULL DEFAULT 1 ); CREATE INDEX idx_votes_option_id ON votes(option_id); CREATE INDEX idx_vote_tokens_issue_id ON vote_tokens(issue_id); CREATE INDEX idx_options_issue_id ON options(issue_id);