-- Registry of flexible field definitions (the "schema of schemas"). CREATE TABLE field_definition ( id UUID PRIMARY KEY, key TEXT NOT NULL UNIQUE CHECK (key <> ''), data_type TEXT NOT NULL CHECK (data_type IN ('text', 'localized_text', 'integer', 'date', 'boolean', 'term', 'authority')), vocabulary_id UUID REFERENCES vocabulary (id) ON DELETE RESTRICT, authority_kind TEXT CHECK (authority_kind IN ('person', 'organisation', 'place')), required BOOLEAN NOT NULL DEFAULT false, group_key TEXT CHECK (group_key <> ''), -- A term field must name a vocabulary; any other type must not. CONSTRAINT term_has_vocabulary CHECK ((data_type = 'term') = (vocabulary_id IS NOT NULL)), -- authority_kind is only meaningful for authority fields. CONSTRAINT authority_kind_only_for_authority CHECK (authority_kind IS NULL OR data_type = 'authority') ); CREATE TABLE field_definition_label ( field_definition_id UUID NOT NULL REFERENCES field_definition (id) ON DELETE CASCADE, lang TEXT NOT NULL CHECK (lang <> ''), label TEXT NOT NULL CHECK (label <> ''), PRIMARY KEY (field_definition_id, lang) );