Перейти к содержанию

Схема базы данных

START TRANSACTION;

DO $EF$
BEGIN
    IF NOT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = 'rfidregistry') THEN
        CREATE SCHEMA rfidregistry;
    END IF;
END $EF$;

CREATE EXTENSION IF NOT EXISTS pg_trgm;

CREATE TABLE rfidregistry.records (
    id uuid NOT NULL,
    rfid_type character varying(32) NOT NULL,
    encryption_type character varying(32) NOT NULL,
    uid character varying(14) NOT NULL,
    status_type character varying(32) NOT NULL,
    new_at timestamp without time zone NOT NULL,
    shipped_at timestamp without time zone NOT NULL,
    defect_at timestamp without time zone NOT NULL,
    in_use_at timestamp without time zone NOT NULL,
    in_use_rfid_id character varying(16),
    data_cells jsonb NOT NULL DEFAULT '[]',
    resource_owner_id character varying(255) NOT NULL,
    package_info_box integer NOT NULL,
    package_info_place integer NOT NULL,
    changed_at timestamp without time zone NOT NULL,
    aes_key_configurations jsonb NOT NULL DEFAULT '[]',
    trailers jsonb NOT NULL DEFAULT '[]',
    order_number character varying(256) NOT NULL,
    order_at timestamp without time zone NOT NULL,
    in_use_resource_owner_id character varying(255),
    is_deleted boolean NOT NULL,
    deleted_at timestamp without time zone NOT NULL,
    vendor_name character varying(100),
    identification_method_type character varying(32) NOT NULL,
    CONSTRAINT pk_records PRIMARY KEY (id)
);
COMMENT ON TABLE rfidregistry.records IS 'Запись. # Описание модели';
COMMENT ON COLUMN rfidregistry.records.id IS 'Идентификатор. Если не передан создаётся сервером. # Тип: Guid';
COMMENT ON COLUMN rfidregistry.records.rfid_type IS 'Тип ключа';
COMMENT ON COLUMN rfidregistry.records.encryption_type IS 'Тип шифрования ключа. Максимально поддерживаемый ключом тип шифрования';
COMMENT ON COLUMN rfidregistry.records.uid IS 'Номер ключа. Указывается при создании. # Диапазон: 1..14';
COMMENT ON COLUMN rfidregistry.records.status_type IS 'Тип статуса ключа';
COMMENT ON COLUMN rfidregistry.records.new_at IS 'Дата перевода в статус \"Новый\". # Тип: DateTime';
COMMENT ON COLUMN rfidregistry.records.shipped_at IS 'Дата перевода в статус \"Отгружен\". # Тип: DateTime';
COMMENT ON COLUMN rfidregistry.records.defect_at IS 'Дата перевода в статус \"Брак\". # Тип: DateTime';
COMMENT ON COLUMN rfidregistry.records.in_use_at IS 'Дата перевода в статус \"Использован\". # Тип: DateTime';
COMMENT ON COLUMN rfidregistry.records.in_use_rfid_id IS 'Идентификатор привязанного ключа. Заполняется при переводе в статус \"Использован\". # Диапазон: 0..16';
COMMENT ON COLUMN rfidregistry.records.data_cells IS 'Содержимое ячеек ключа';
COMMENT ON COLUMN rfidregistry.records.resource_owner_id IS 'Идентификатор владельца. Заполняется сервером. # Диапазон: 0..255';
COMMENT ON COLUMN rfidregistry.records.package_info_box IS 'Номер коробки. # Диапазон: 1..2147483647';
COMMENT ON COLUMN rfidregistry.records.package_info_place IS 'Номер места в коробке. # Диапазон: 1..2147483647';
COMMENT ON COLUMN rfidregistry.records.changed_at IS 'Дата последнего изменения. Заполняется и обновляется сервером. Заполняется при создании и изменении. Является версией объекта. # Тип: DateTime';
COMMENT ON COLUMN rfidregistry.records.aes_key_configurations IS 'Конфигурации шифрования ключа';
COMMENT ON COLUMN rfidregistry.records.trailers IS 'Контрольные суммы. Нужны для ключей SL1 и SL3';
COMMENT ON COLUMN rfidregistry.records.order_number IS 'Номер заказа. # Диапазон: 0..256';
COMMENT ON COLUMN rfidregistry.records.order_at IS 'Дата заказа. # Тип: DateTime';
COMMENT ON COLUMN rfidregistry.records.in_use_resource_owner_id IS 'Владелец привязанного ключа. Заполняется сервером, значение берётся из токена при использовании ключа. # Диапазон: 0..255';
COMMENT ON COLUMN rfidregistry.records.is_deleted IS 'Признак, удалена ли запись';
COMMENT ON COLUMN rfidregistry.records.deleted_at IS 'Дата удаления. # Тип: DateTime';
COMMENT ON COLUMN rfidregistry.records.vendor_name IS 'Производитель. # Диапазон: 3..100';
COMMENT ON COLUMN rfidregistry.records.identification_method_type IS 'Метод идентификации';

CREATE INDEX ix_records_aes_key_configurations ON rfidregistry.records USING gin (aes_key_configurations jsonb_ops);

CREATE INDEX ix_records_changed_at ON rfidregistry.records USING btree (changed_at DESC);

CREATE INDEX ix_records_data_cells ON rfidregistry.records USING gin (data_cells jsonb_ops);

CREATE INDEX ix_records_encryption_type ON rfidregistry.records (encryption_type DESC);

CREATE INDEX ix_records_id ON rfidregistry.records (id DESC);

CREATE INDEX ix_records_identification_method_type ON rfidregistry.records (identification_method_type DESC);

CREATE INDEX ix_records_in_use_resource_owner_id ON rfidregistry.records (in_use_resource_owner_id DESC);

CREATE INDEX ix_records_in_use_rfid_id ON rfidregistry.records (in_use_rfid_id DESC);

CREATE INDEX ix_records_is_deleted ON rfidregistry.records (is_deleted DESC);

CREATE INDEX ix_records_new_at ON rfidregistry.records USING btree (new_at DESC);

CREATE INDEX ix_records_order_at ON rfidregistry.records USING btree (order_at DESC);

CREATE INDEX ix_records_order_number ON rfidregistry.records USING btree (order_number DESC);

CREATE INDEX ix_records_order_number_vendor_name ON rfidregistry.records USING gin (to_tsvector('russian', order_number || ' ' || coalesce(vendor_name, '')));

CREATE INDEX ix_records_package_info_box ON rfidregistry.records (package_info_box DESC);

CREATE INDEX ix_records_package_info_place ON rfidregistry.records (package_info_place DESC);

CREATE INDEX ix_records_resource_owner_id ON rfidregistry.records (resource_owner_id DESC);

CREATE INDEX ix_records_rfid_type ON rfidregistry.records (rfid_type DESC);

CREATE INDEX ix_records_shipped_at ON rfidregistry.records (shipped_at DESC);

CREATE INDEX ix_records_status_type ON rfidregistry.records (status_type DESC);

CREATE INDEX ix_records_trailers ON rfidregistry.records USING gin (trailers jsonb_ops);

CREATE INDEX ix_records_uid ON rfidregistry.records (uid DESC);


COMMIT;