121 lines
3.8 KiB
MySQL
121 lines
3.8 KiB
MySQL
|
-- Create types
|
||
|
DO $$
|
||
|
BEGIN
|
||
|
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'question_type') THEN
|
||
|
CREATE TYPE question_type AS ENUM (
|
||
|
'variant',
|
||
|
'images',
|
||
|
'varimg',
|
||
|
'emoji',
|
||
|
'text',
|
||
|
'select',
|
||
|
'date',
|
||
|
'number',
|
||
|
'file',
|
||
|
'page',
|
||
|
'rating'
|
||
|
);
|
||
|
END IF;
|
||
|
|
||
|
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'quiz_status') THEN
|
||
|
CREATE TYPE quiz_status AS ENUM (
|
||
|
'draft',
|
||
|
'template',
|
||
|
'stop',
|
||
|
'start',
|
||
|
'timeout',
|
||
|
'offlimit'
|
||
|
);
|
||
|
END IF;
|
||
|
|
||
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||
|
END$$;
|
||
|
|
||
|
-- Create tables
|
||
|
CREATE TABLE IF NOT EXISTS account (
|
||
|
id UUID PRIMARY KEY,
|
||
|
user_id VARCHAR(24),
|
||
|
email VARCHAR(50),
|
||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
deleted BOOLEAN DEFAULT false
|
||
|
);
|
||
|
|
||
|
CREATE TABLE IF NOT EXISTS quiz (
|
||
|
id bigserial UNIQUE NOT NULL PRIMARY KEY,
|
||
|
qid uuid DEFAULT uuid_generate_v4(),
|
||
|
accountid varchar(30) NOT NULL,
|
||
|
deleted boolean DEFAULT false,
|
||
|
archived boolean DEFAULT false,
|
||
|
fingerprinting boolean DEFAULT false,
|
||
|
repeatable boolean DEFAULT false,
|
||
|
note_prevented boolean DEFAULT false,
|
||
|
mail_notifications boolean DEFAULT false,
|
||
|
unique_answers boolean DEFAULT false,
|
||
|
super boolean DEFAULT false,
|
||
|
group_id bigint DEFAULT 0,
|
||
|
name varchar(280),
|
||
|
description text,
|
||
|
config text,
|
||
|
status quiz_status DEFAULT 'draft',
|
||
|
limit_answers integer DEFAULT 0,
|
||
|
due_to integer DEFAULT 0,
|
||
|
time_of_passing integer DEFAULT 0,
|
||
|
pausable boolean DEFAULT false,
|
||
|
version smallint DEFAULT 0,
|
||
|
version_comment text DEFAULT '',
|
||
|
parent_ids integer[],
|
||
|
created_at timestamp DEFAULT CURRENT_TIMESTAMP,
|
||
|
updated_at timestamp DEFAULT CURRENT_TIMESTAMP,
|
||
|
questions_count integer DEFAULT 0,
|
||
|
answers_count integer DEFAULT 0,
|
||
|
average_time_passing integer DEFAULT 0
|
||
|
);
|
||
|
|
||
|
CREATE TABLE IF NOT EXISTS question (
|
||
|
id bigserial UNIQUE NOT NULL PRIMARY KEY,
|
||
|
quiz_id bigint NOT NULL,
|
||
|
title varchar(512) NOT NULL,
|
||
|
description text,
|
||
|
questiontype question_type DEFAULT 'text',
|
||
|
required boolean DEFAULT false,
|
||
|
deleted boolean DEFAULT false,
|
||
|
page smallint DEFAULT 0,
|
||
|
content text,
|
||
|
version smallint DEFAULT 0,
|
||
|
parent_ids integer[],
|
||
|
created_at timestamp DEFAULT CURRENT_TIMESTAMP,
|
||
|
updated_at timestamp DEFAULT CURRENT_TIMESTAMP,
|
||
|
CONSTRAINT quiz_relation FOREIGN KEY(quiz_id) REFERENCES quiz(id)
|
||
|
);
|
||
|
|
||
|
CREATE TABLE IF NOT EXISTS answer (
|
||
|
id bigserial UNIQUE NOT NULL PRIMARY KEY,
|
||
|
content text,
|
||
|
quiz_id bigint NOT NULL REFERENCES quiz(id),
|
||
|
question_id bigint NOT NULL REFERENCES question(id),
|
||
|
fingerprint varchar(1024),
|
||
|
session varchar(20),
|
||
|
created_at timestamp DEFAULT CURRENT_TIMESTAMP
|
||
|
);
|
||
|
|
||
|
CREATE TABLE IF NOT EXISTS privileges (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
privilegeID VARCHAR(50),
|
||
|
account_id UUID,
|
||
|
privilege_name VARCHAR(255),
|
||
|
amount INT,
|
||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
FOREIGN KEY (account_id) REFERENCES account (id)
|
||
|
);
|
||
|
|
||
|
-- Create indexes
|
||
|
CREATE INDEX IF NOT EXISTS active ON question(deleted) WHERE deleted=false;
|
||
|
CREATE INDEX IF NOT EXISTS relation ON question(quiz_id DESC);
|
||
|
CREATE INDEX IF NOT EXISTS required ON question(required DESC);
|
||
|
CREATE INDEX IF NOT EXISTS questiontype ON question(questiontype);
|
||
|
CREATE INDEX IF NOT EXISTS active ON quiz(deleted, archived, status) WHERE deleted = false AND archived = false AND status = 'start';
|
||
|
CREATE INDEX IF NOT EXISTS timeouted ON quiz(due_to DESC) WHERE deleted = false AND due_to <> 0 AND status <> 'timeout';
|
||
|
CREATE INDEX IF NOT EXISTS groups ON quiz(super) WHERE super = true;
|
||
|
CREATE INDEX IF NOT EXISTS birthtime ON quiz(created_at DESC);
|
||
|
CREATE INDEX IF NOT EXISTS subquizes ON quiz(group_id DESC) WHERE group_id <> 0;
|