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: для обеспечения ограничения используется индекс GiSTroom_id WITH =: гарантирует, что ограничение применяется к бронированиям одного и того же номера.tstzrange(start_time, end_time) WITH &&: используется оператор &&, чтобы гарантировать, что временные диапазоны не перекрываются.📚 Итого:
Наличие правильных
constraints поможет сохранить данные в правильном формате, а также повысить производительность, поскольку исключается наличие недействительной информации в базе данных, что приведет к тому, что необходимо обрабатывать, сканировать или запрашивать меньше данных.💬 Делитесь мнениями в комментариях👇! Если вам понравилась статья, поставьте лайк! 👍
#PostgreSQL #DATABASE
Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.