1 of 11

POSTGRESQL

(кастомные типы)

Студент: Плиев Константин Давидович

Преподаватель: Панкратов Александр Серафимович

РУДН

2022

2 of 11

Следует отметить, что:

  1. PostgreSQL была первой базой данных, которая представила объекты в реляционных системах (сериализация)
  2. Есть элементы ООП(наследование)

Что ж, с какой-то точки зрения Postgresql может рассматривать сущности таблиц как составной тип, который можно рассматривать как объекты. В сочетании с массивом это может быть очень мощным

3 of 11

CREATE TYPE

CREATE TYPE регистрирует новый тип данных для использования в текущей базе данных. Владельцем типа становится создавший его пользователь.

Имя типа должно отличаться от имён любых других существующих типов или доменов в той же схеме. (А так как с таблицами связываются типы данных, имя типа должно также отличаться и от имён существующих таблиц в этой схеме.)

В этом примере создаётся составной тип, а затем он используется в определении функции:

В этом примере создаётся тип-перечисление, а затем он используется в определении таблицы:

4 of 11

Особенности CREATE TYPE

  1. При создании любого нового типа PostgreSQL автоматически создаёт соответствующий тип массива, имя которого он получает, добавляя подчёркивание перед именем типа элементов.
  2. CREATE TYPE, создающая составной тип, соответствует стандарту SQL. Другие формы являются расширениями PostgreSQL. Для оператора CREATE TYPE в стандарте SQL также определены другие формы, не реализованные в PostgreSQL

5 of 11

Массивы

PostgreSQL позволяет определять столбцы таблицы как многомерные массивы переменной длины. Элементами массивов могут быть любые встроенные или определённые пользователями базовые типы, перечисления, составные типы, типы-диапазоны или домены.

Чтобы проиллюстрировать использование массивов, мы создадим такую таблицу:

CREATE TABLE sal_emp (

name text,

pay_by_quarter integer[],

schedule text[][]

);

Можно вводить значения:

'{{1,2,3},{4,5,6},{7,8,9}}'

Можно ввести INSERT

INSERT INTO sal_emp

VALUES ('Bill',

'{10000, 10000, 10000, 10000}',

'{{"meeting", "lunch"}, {"training", "presentation"}}');

INSERT INTO sal_emp

VALUES ('Carol',

'{20000, 25000, 25000, 25000}',

'{{"breakfast", "consulting"}, {"meeting", "lunch"}}');

6 of 11

Продолжаем работать с массивами

В многомерных массивов число элементов в каждой размерности должно быть одинаковым; в противном случае возникает ошибка.

Результат двух предыдущих команд:

Кстати, у PostgreSQL своеобразная поддержка массивов в массиве. Почему?

Один общий ответ заключается в том, что массивы по своей сути являются антиреляционными. Удаление повторяющихся значений - это то, как вы достигаете 1-й нормальной формы. Повторить группы повторяющихся групп кажется совершенно безумным с реляционной теоретической точки зрения.

7 of 11

Подробнее о составных типах

8 of 11

Составной тип данных – это тип данных, который включает структуру данных, состоящую из нескольких имен полей и соответствующих типов данных.

Чтобы использовать составной тип данных, например, для создания столбца составного типа, необходимо предварительно создать составной тип данных с нужной структурой.

Это можно сделать с помощью графического инструмента pgAdmin 4 или с помощью выполнения инструкций языка SQL.

Представим, что нам необходимо создать таблицу (products), в которой нужно хранить товары, при этом каждый товар имеет определённый тип. В свою очередь этот тип товара имеет два свойства:

  1. kod – код типа;
  2. name – наименование типа.

9 of 11

Графически:

10 of 11

Создание составного типа с помощью SQL

На SQL составной тип данных создается достаточно просто, для этого используется команда CREATE TYPE.

Чтобы создать точно такой же составной тип данных, который мы создали чуть ранее, мы можем использовать следующую SQL инструкцию, которую необходимо выполнить в редакторе SQL запросов (Запросник) в контексте нужной базы данных.

11 of 11

Составной тип данных теперь у нас есть и мы можем его использовать, например, указать в качестве типа данных у столбца при создании таблицы.

CREATE TABLE products (

id INT NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY,

name VARCHAR(100) NOT NULL,

type product_type NOT NULL,

price NUMERIC(18,2) NULL

);