Схема базы данных
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;