core/schema/000001_init.up.sql

121 lines
3.8 KiB
MySQL
Raw Normal View History

-- 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;