51 lines
1.9 KiB
MySQL
51 lines
1.9 KiB
MySQL
|
|
-- Voting System Tables
|
||
|
|
|
||
|
|
-- Vote Events Table
|
||
|
|
CREATE TABLE IF NOT EXISTS vote_events (
|
||
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
|
|
title VARCHAR(255) NOT NULL,
|
||
|
|
description TEXT,
|
||
|
|
start_date TIMESTAMP WITHOUT TIME ZONE NOT NULL,
|
||
|
|
end_date TIMESTAMP WITHOUT TIME ZONE NOT NULL,
|
||
|
|
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
||
|
|
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE TRIGGER trg_vote_events_updated_at
|
||
|
|
BEFORE UPDATE ON vote_events
|
||
|
|
FOR EACH ROW EXECUTE FUNCTION set_updated_at();
|
||
|
|
|
||
|
|
-- Candidates Table
|
||
|
|
CREATE TABLE IF NOT EXISTS candidates (
|
||
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
|
|
vote_event_id UUID NOT NULL REFERENCES vote_events(id) ON DELETE CASCADE,
|
||
|
|
name VARCHAR(255) NOT NULL,
|
||
|
|
image_url VARCHAR(500),
|
||
|
|
description TEXT,
|
||
|
|
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE TRIGGER trg_candidates_updated_at
|
||
|
|
BEFORE UPDATE ON candidates
|
||
|
|
FOR EACH ROW EXECUTE FUNCTION set_updated_at();
|
||
|
|
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_candidates_vote_event_id ON candidates(vote_event_id);
|
||
|
|
|
||
|
|
-- Votes Table
|
||
|
|
CREATE TABLE IF NOT EXISTS votes (
|
||
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
|
|
vote_event_id UUID NOT NULL REFERENCES vote_events(id) ON DELETE CASCADE,
|
||
|
|
candidate_id UUID NOT NULL REFERENCES candidates(id) ON DELETE CASCADE,
|
||
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||
|
|
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Ensure one vote per user per event
|
||
|
|
CREATE UNIQUE INDEX IF NOT EXISTS uq_votes_user_event
|
||
|
|
ON votes(user_id, vote_event_id);
|
||
|
|
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_votes_vote_event_id ON votes(vote_event_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_votes_candidate_id ON votes(candidate_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_votes_user_id ON votes(user_id);
|