50 lines
1.2 KiB
SQL
50 lines
1.2 KiB
SQL
CREATE TABLE IF NOT EXISTS entity_types (
|
|
id SMALLSERIAL PRIMARY KEY,
|
|
name TEXT UNIQUE NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS entities (
|
|
id UUID PRIMARY KEY DEFAULT uuidv7(),
|
|
type_id SMALLINT REFERENCES entity_types(id),
|
|
name TEXT NOT NULL,
|
|
slug TEXT UNIQUE,
|
|
description TEXT,
|
|
thumbnail_url TEXT,
|
|
status SMALLINT DEFAULT 1, -- 1 draft, 2 published
|
|
is_deleted BOOLEAN NOT NULL DEFAULT false,
|
|
reviewed_by UUID REFERENCES users(id),
|
|
reviewed_at TIMESTAMPTZ,
|
|
created_at TIMESTAMPTZ DEFAULT now(),
|
|
updated_at TIMESTAMPTZ DEFAULT now()
|
|
);
|
|
|
|
CREATE UNIQUE INDEX uniq_entities_slug_active
|
|
ON entities(slug)
|
|
WHERE is_deleted = false;
|
|
|
|
CREATE INDEX idx_entities_type
|
|
ON entities(type_id)
|
|
WHERE is_deleted = false;
|
|
|
|
|
|
CREATE INDEX idx_entities_status_created
|
|
ON entities(status, created_at DESC)
|
|
WHERE is_deleted = false;
|
|
|
|
|
|
CREATE INDEX idx_entities_type_status
|
|
ON entities(type_id, status)
|
|
WHERE is_deleted = false;
|
|
|
|
|
|
CREATE INDEX idx_entities_reviewed_by
|
|
ON entities(reviewed_by)
|
|
WHERE is_deleted = false;
|
|
|
|
CREATE INDEX idx_entities_name_search
|
|
ON entities USING gin (name gin_trgm_ops);
|
|
|
|
CREATE TRIGGER trigger_entities_updated_at
|
|
BEFORE UPDATE ON entities
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_updated_at(); |