wiki:DatabaseCreation

Version 21 (modified by 231027, 6 days ago) ( diff )

--

Креирање на базата

DDL

Event, Concert, Play

CREATE TABLE "Event" (
    event_id BIGSERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    description TEXT NOT NULL,
    min_age INT NOT NULL
);

CREATE TABLE "Concert" (
    event_id BIGINT PRIMARY KEY,
    concert_type VARCHAR(50) NOT NULL,
    setlist TEXT NOT NULL,

    CONSTRAINT fk_concert_event FOREIGN KEY (event_id) REFERENCES "Event" (event_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

CREATE TABLE "Play" (
    event_id BIGINT PRIMARY KEY,
    genre VARCHAR(50) NOT NULL,
    number_of_acts INT NOT NULL,
    language VARCHAR(50) NOT NULL,
    director VARCHAR(255) NOT NULL,

    CONSTRAINT fk_play_event FOREIGN KEY (event_id) REFERENCES "Event" (event_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

Performer, Musical_Performer, Acting_Performer

CREATE TABLE "Performer" (
    performer_id BIGSERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    number_of_members INT NOT NULL,
    contact_email VARCHAR(255) NOT NULL UNIQUE,
    technical_requirements TEXT NOT NULL,

    CONSTRAINT performer_contact_email_check CHECK (contact_email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
);

CREATE TABLE "Musical_Performer" (
    performer_id BIGINT PRIMARY KEY,
    musician_type VARCHAR(50) NOT NULL,
    genre VARCHAR(50) NOT NULL,
    record_label VARCHAR(255) NOT NULL,

    CONSTRAINT fk_musical_performer_performer FOREIGN KEY (performer_id) REFERENCES "Performer" (performer_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

CREATE TABLE "Acting_Performer" (
    performer_id BIGINT PRIMARY KEY,
    role_type VARCHAR(50) NOT NULL,
    acting_style VARCHAR(100) NOT NULL,
    agency VARCHAR(255) NOT NULL,

    CONSTRAINT fk_acting_performer_performer FOREIGN KEY (performer_id) REFERENCES "Performer" (performer_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

Venue, Section, Seat

CREATE TABLE "Venue" (
    venue_id BIGSERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    number_of_sections INT NOT NULL,
    number_of_seats INT NOT NULL,
    address_street VARCHAR(255) NOT NULL,
    address_city VARCHAR(100) NOT NULL,
    address_country VARCHAR(100) NOT NULL
);

CREATE TABLE "Section" (
    section_id BIGSERIAL PRIMARY KEY,
    venue_id BIGINT NOT NULL,
    name VARCHAR(255) NOT NULL,
    number_of_seats INT NOT NULL,

    CONSTRAINT fk_section_venue FOREIGN KEY (venue_id) REFERENCES "Venue" (venue_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT uq_section_venue_name UNIQUE (venue_id, name)
);

CREATE TABLE "Seat" (
    seat_id BIGSERIAL PRIMARY KEY,
    section_id BIGINT NOT NULL,
    seat_number INT NOT NULL,

    CONSTRAINT fk_seat_section FOREIGN KEY (section_id) REFERENCES "Section" (section_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT uq_seat_section_number UNIQUE (section_id, seat_number)
);

Organizer, Sponsor

CREATE TABLE "Organizer" (
    organizer_id BIGSERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    contact_email VARCHAR(255) NOT NULL UNIQUE,

    CONSTRAINT organizer_contact_email_check CHECK (contact_email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
);

CREATE TABLE "Sponsor" (
    sponsor_id BIGSERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    contact_email VARCHAR(255) NOT NULL UNIQUE,
    sponsor_type VARCHAR(50) NOT NULL,

    CONSTRAINT sponsor_contact_email_check CHECK (contact_email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
);

Event_Happening, Event_Period

CREATE TABLE "Event_Happening" (
    event_happening_id BIGSERIAL PRIMARY KEY,
    event_id BIGINT NOT NULL,
    event_time TIMESTAMP NOT NULL,
    venue_id BIGINT NOT NULL,
    duration INT NOT NULL,

    CONSTRAINT fk_event_happening_event FOREIGN KEY (event_id) REFERENCES "Event" (event_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE,
    CONSTRAINT fk_event_happening_venue FOREIGN KEY (venue_id) REFERENCES "Venue" (venue_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE,
    CONSTRAINT uq_happening_time_venue UNIQUE (event_time, venue_id)
);

CREATE TABLE "Event_Period" (
    period_id BIGSERIAL PRIMARY KEY,
    event_happening_id BIGINT NOT NULL,
    name VARCHAR(255) NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE NOT NULL,
    price_change_percent INT NOT NULL,
    increase_decrease BOOLEAN NOT NULL,

    CONSTRAINT fk_event_period_event_happening FOREIGN KEY (event_happening_id) REFERENCES "Event_Happening" (event_happening_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT uq_period_happening_name UNIQUE (event_happening_id, name),
    CONSTRAINT event_period_dates_check CHECK (start_date <= end_date)
);

M:N релации: Event_Happening_Performer, Event_Happening_Organizer, Event_Happening_Sponsor

CREATE TABLE "Event_Happening_Performer" (
    event_happening_id BIGINT NOT NULL,
    performer_id BIGINT NOT NULL,

    CONSTRAINT pk_event_happening_performer PRIMARY KEY (event_happening_id, performer_id),
    CONSTRAINT fk_ehp_event_happening FOREIGN KEY (event_happening_id) REFERENCES "Event_Happening" (event_happening_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_ehp_performer FOREIGN KEY (performer_id) REFERENCES "Performer" (performer_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT uq_performer_at_time UNIQUE (performer_id, event_happening_id)
);

CREATE TABLE "Event_Happening_Organizer" (
    event_happening_id BIGINT NOT NULL,
    organizer_id BIGINT NOT NULL,

    CONSTRAINT event_happening_organizer PRIMARY KEY (event_happening_id, organizer_id),
    CONSTRAINT fk_eho_event_happening FOREIGN KEY (event_happening_id) REFERENCES "Event_Happening" (event_happening_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_eho_organizer FOREIGN KEY (organizer_id) REFERENCES "Organizer" (organizer_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

CREATE TABLE "Event_Happening_Sponsor" (
    event_happening_id BIGINT NOT NULL,
    sponsor_id BIGINT NOT NULL,

    CONSTRAINT event_happening_sponsor PRIMARY KEY (event_happening_id, sponsor_id),
    CONSTRAINT fk_ehs_event_happening FOREIGN KEY (event_happening_id) REFERENCES "Event_Happening" (event_happening_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_ehs_sponsor FOREIGN KEY (sponsor_id) REFERENCES "Sponsor" (sponsor_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

User, Event_Happening_Rating

CREATE TABLE "User" (
    user_id BIGSERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    first_name VARCHAR(100) NOT NULL,
    last_name VARCHAR(100) NOT NULL,
    date_of_birth DATE NOT NULL,
    contact_email VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(100) NOT NULL,
    registration_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT user_date_of_birth_check CHECK (date_of_birth < CURRENT_DATE),
    CONSTRAINT user_contact_email_check CHECK (contact_email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'),
    CONSTRAINT user_password_check CHECK (
        length(password) >= 8 AND
        password ~ '[A-Z]' AND
        password ~ '[a-z]' AND
        password ~ '[0-9]' AND
        password ~ '[^a-zA-Z0-9]'
    )
);

CREATE TABLE "Event_Happening_Rating" (
    rating_id BIGSERIAL PRIMARY KEY,
    rating INT NOT NULL CHECK (rating BETWEEN 1 AND 10),
    comment TEXT,
    event_happening_id BIGINT NOT NULL,
    user_id BIGINT NOT NULL DEFAULT 0,

    CONSTRAINT fk_event_happening_rating_event_happening FOREIGN KEY (event_happening_id) REFERENCES "Event_Happening" (event_happening_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_event_happening_rating_user FOREIGN KEY (user_id) REFERENCES "User" (user_id)
        ON DELETE SET DEFAULT
        ON UPDATE CASCADE,
    CONSTRAINT uq_rating_happening_user UNIQUE (event_happening_id, user_id)
);

Ticket, Ticket_Purchase, Ticket_Refund

CREATE TABLE "Ticket" (
    ticket_id BIGSERIAL PRIMARY KEY,
    ticket_type VARCHAR(50) NOT NULL,
    base_price FLOAT4 NOT NULL,
    is_available BOOLEAN NOT NULL DEFAULT TRUE,
    event_happening_id BIGINT NOT NULL,
    seat_id BIGINT NOT NULL,

    CONSTRAINT fk_ticket_event_happening FOREIGN KEY (event_happening_id)
        REFERENCES "Event_Happening" (event_happening_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE,
    CONSTRAINT fk_ticket_seat FOREIGN KEY (seat_id)
        REFERENCES "Seat" (seat_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT uq_ticket_event_happening_seat UNIQUE (event_happening_id, seat_id)
);

CREATE TABLE "Ticket_Purchase" (
    purchase_id BIGSERIAL PRIMARY KEY,
    ticket_id BIGINT NOT NULL,
    user_id BIGINT NOT NULL DEFAULT 0,
    qr_code VARCHAR(255) NOT NULL UNIQUE,
    purchase_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    purchase_amount FLOAT4 NOT NULL,

    CONSTRAINT fk_purchase_ticket FOREIGN KEY (ticket_id) REFERENCES "Ticket" (ticket_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE,
    CONSTRAINT fk_purchase_user FOREIGN KEY (user_id) REFERENCES "User" (user_id)
        ON DELETE SET DEFAULT
        ON UPDATE CASCADE
);

CREATE TABLE "Ticket_Refund" (
    refund_id BIGSERIAL PRIMARY KEY,
    purchase_id BIGINT NOT NULL UNIQUE,
    refund_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    refund_amount FLOAT4 NOT NULL,
    reason TEXT,

    CONSTRAINT fk_refund_purchase FOREIGN KEY (purchase_id) REFERENCES "Ticket_Purchase" (purchase_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

Погледи (Views)

Performer_Events

CREATE VIEW "Performer_Events" AS
SELECT p.performer_id,
       p.name AS performer_name,
       e.event_id,
       e.name AS event_name,
       eh.event_time
FROM "Performer" p
JOIN "Event_Happening_Performer" ehp ON p.performer_id = ehp.performer_id
JOIN "Event_Happening" eh ON ehp.event_happening_id = eh.event_happening_id
JOIN "Event" e ON eh.event_id = e.event_id;

Venue_Layout

CREATE VIEW "Venue_Layout" AS
SELECT v.venue_id,
       v.name AS venue_name,
       s.section_id,
       s.name AS section_name,
       st.seat_id,
       st.seat_number
FROM "Venue" v
JOIN "Section" s ON v.venue_id = s.venue_id
JOIN "Seat" st ON s.section_id = st.section_id;

User_Tickets

CREATE VIEW "User_Tickets" AS
SELECT u.user_id,
       u.username,
       t.ticket_id,
       tp.purchase_id,
       tp.qr_code,
       tr.refund_id,
       tr.refund_time
FROM "User" u
JOIN "Ticket_Purchase" tp ON u.user_id = tp.user_id
JOIN "Ticket" t ON tp.ticket_id = t.ticket_id
LEFT JOIN "Ticket_Refund" tr ON tp.purchase_id = tr.purchase_id;

Event_User_Ratings

CREATE VIEW "Event_User_Ratings" AS
SELECT eh.event_happening_id,
       e.event_id,
       e.name AS event_name,
       u.user_id,
       u.username,
       ehr.rating_id,
       ehr.rating,
       ehr.comment
FROM "Event" e
JOIN "Event_Happening" eh ON e.event_id = eh.event_id
JOIN "Event_Happening_Rating" ehr ON eh.event_happening_id = ehr.event_happening_id
JOIN "User" u ON ehr.user_id = u.user_id;

Event_Overall_Ratings

CREATE VIEW "Event_Overall_Ratings" AS
SELECT 
    e.event_id,
    e.name AS event_name,
    eh.event_happening_id,
    eh.event_time,
    COUNT(ehr.rating_id) AS total_reviews,
    ROUND(AVG(ehr.rating), 2) AS average_rating
FROM "Event" e
JOIN "Event_Happening" eh ON e.event_id = eh.event_id
JOIN "Event_Happening_Rating" ehr ON eh.event_happening_id = ehr.event_happening_id
GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time;

Event_Financial_Summary

CREATE VIEW "Event_Financial_Summary" AS
SELECT 
    e.event_id,
    e.name AS event_name,
    eh.event_happening_id,
    eh.event_time,
    COUNT(tp.purchase_id) AS total_tickets_sold,
    SUM(tp.purchase_amount) AS total_revenue,
    ROUND(AVG(tp.purchase_amount), 2) AS avg_ticket_price
FROM "Event" e
JOIN "Event_Happening" eh ON e.event_id = eh.event_id
JOIN "Ticket" t ON eh.event_happening_id = t.event_happening_id
JOIN "Ticket_Purchase" tp ON t.ticket_id = tp.ticket_id
GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time;

Note: See TracWiki for help on using the wiki.