Пейджер

puts "Hello, World🌟!"

puts "Hello, World🌟!"

🌍 Привет, мир!
Cегодня продолжим говорить об индексах, но уже зайдем с другой стороны — о валидации данных при помощи ограничений. Вы могли подумать, но причем здесь индексы? 🤔 Некоторые ограничения автоматически создают индекс при их создании. Если вы пропустили предыдущий пост, #DATABASE вам в помощь! Информация будет ориентирована на PostgreSQL, но пригодится и для других СУБД.

🔥 Мотивация

Многие, наверняка, слышали о constraints. Это условия, которые должны быть соблюдены для корректного состояния данных в таблице. Иногда одного типа данных недостаточно. Например, у вас есть таблица product со столбцом price, где должны быть только положительные числа. Но стандартного типа данных, который принимает только положительные значения, не существует. В помощь приходят constraints.

🚀 Какие существуют ограничения?

Primary Key: обеспечивает уникальный идентификатор для строк в таблице.
  CREATE TABLE product (
      product_id integer,
      price numeric,
      name text,
      PRIMARY KEY (product_id)
  );


⚠️ Обратите внимание:
- Значение должно быть уникальным и ненулевым.
- Может охватывать более одного столбца.
- Автоматически создается уникальный индекс B-tree.
- Столбец будет помечен как NOT NULL.
- Таблица может иметь только один primary key.

Unique Constraints: обеспечивают уникальность данных в столбце или группе столбцов.
  CREATE TABLE product (
      product_id integer,
      price numeric,
      name text,
      CONSTRAINT must_be_different UNIQUE
  );


⚠️ Обратите внимание:
- Автоматически создается уникальный индекс B-tree.
- Значения NULL не считаются уникальными.
- NULLS NOT DISTINCT позволяет сделать NULL значения различными.
  -- Пример использования NULLS NOT DISTINCT
  CREATE UNIQUE INDEX idx_example_value ON example (value) NULLS NOT DISTINCT;


Not-Null Constraints: гарантируют отсутствие пустых значений в столбце.
  CREATE TABLE products (
      product_id integer NOT NULL,
      name text NOT NULL,
      price numeric
  );


Foreign Key: обеспечивает связь с другой таблицей и предотвращает появление "призрачных" ссылок. К примеру, у нас есть таблица products из примеров выше и к ней добавляем foreign key (references).
  CREATE TABLE orders (
      order_id integer PRIMARY KEY,
      product_id integer REFERENCES products,
      quantity integer
  );


⚠️ Обратите внимание:
- Таблица может иметь несколько foreign key.
- Опции restrict, cascade, no action (default behavior), set null, set default регулируют поведение при удалении или обновлении.
- Ссылка может быть на primary key, unique key или часть non-partial unique index.

Check Constraints: гарантируют выполнение заданных условий.
  CREATE TABLE products (
      product_no integer,
      name text,
      price numeric,
      CONSTRAINT positive_price CHECK (price > 1000)
  );


Exclusion Constraints: гарантируют отсутствие пересечений для определенных комбинаций значений.
  CREATE TABLE room_bookings (
      id bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
      room_id int NOT NULL,
      start_time timestamp NOT NULL,
      end_time timestamp NOT NULL,
      EXCLUDE USING GIST (
          room_id WITH =,
          tstzrange(start_time, end_time) WITH &&
      )
  );

start_time и end_time: временной диапазон бронирования.
EXCLUDE USING GIST: для обеспечения ограничения используется индекс GiST
room_id WITH =: гарантирует, что ограничение применяется к бронированиям одного и того же номера.
tstzrange(start_time, end_time) WITH &&: используется оператор &&, чтобы гарантировать, что временные диапазоны не перекрываются.

📚 Итого:
Наличие правильных constraints поможет сохранить данные в правильном формате, а также повысить производительность, поскольку исключается наличие недействительной информации в базе данных, что приведет к тому, что необходимо обрабатывать, сканировать или запрашивать меньше данных.

💬 Делитесь мнениями в комментариях👇! Если вам понравилась статья, поставьте лайк! 👍

#PostgreSQL #DATABASE
Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.
Подписаться на @ivanchikovitclub Открыть пост в Telegram