PostgreSQL обеспечивает целостность данных через ограничения — правила для данных таблицы. Помимо стандартных (, , , , , ), Postgres добавляет мощные опции, такие как ограничения и гибкие выражения .
PostgreSQL обеспечивает целостность данных через ограничения — правила для данных таблицы. Помимо стандартных (, , , , , ), Postgres добавляет мощные опции, такие как ограничения и гибкие выражения .
PRIMARY KEYFOREIGN KEYUNIQUENOT NULLCHECKDEFAULTCHECKCREATE TABLE bookings (
id SERIAL PRIMARY KEY, -- unique identifier
room_id INT NOT NULL REFERENCES rooms(id), -- foreign key (referential integrity)
email VARCHAR(255) UNIQUE NOT NULL, -- unique + required
guests INT CHECK (guests > 0 AND guests <= 10), -- value constraint
status TEXT DEFAULT 'pending' -- default value
);
PRIMARY KEY → unique row identifier
FOREIGN KEY → references another table (referential integrity, with ON DELETE options)
UNIQUE → no duplicate values
NOT NULL → must have a value
CHECK → value must satisfy a condition
DEFAULT → default value when not provided
CHECK (price > 0)
CHECK (end_date > start_date) -- logical consistency between columns
CHECK (status IN ('active', 'inactive', 'pending'))
CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$') -- regex validation
Oграничения CHECK в Postgres могут обеспечивать богатые бизнес-правила, включая кросс-столбцовые условия и regex-паттерны.
-- prevent OVERLAPPING bookings for the same room (impossible with UNIQUE alone!)
CREATE TABLE bookings (
room_id INT,
during TSRANGE, -- a time range
EXCLUDE USING GIST (room_id WITH =, during WITH &&) -- no two rows where room_id is
); -- equal AND time ranges OVERLAP
EXCLUDE ограничения (функция, специфичная для Postgres) предотвращают строки, которые конфликтуют по пользовательскому оператору — примечательно, предотвращают перекрывающиеся временные диапазоны (двойные бронирования), что не может сделать UNIQUE ограничение.
-- check constraints at COMMIT instead of immediately (useful for circular references)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
Ограничения являются необходимыми для целостности данных — они обеспечивают правила данных на уровне базы данных (последняя линия защиты, всегда применяются независимо от кода приложения), поэтому понимание поддержки ограничений PostgreSQL важно для разработки надёжных баз данных.
Знание стандартных ограничений (PRIMARY KEY, FOREIGN KEY с referential integrity, UNIQUE, NOT NULL, CHECK, DEFAULT) и того, что каждое из них обеспечивает, является фундаментальным для проектирования схемы, предоставляя гарантии на уровне базы данных (уникальность, корректные ссылки, обязательные значения, корректные данные), которые защищают от ошибок, race conditions и несогласованных данных способами, которые код приложения один не может обеспечить.
CHECK ограничения PostgreSQL особенно мощные, обеспечивают богатые бизнес-правила, включая кросс-столбцовые условия (логическую согласованность, такую как end_date > start_date) и даже regex-паттерны — позволяя кодировать правила домена непосредственно в схеме.
Особенно ценно специфичное для Postgres EXCLUDE ограничение, которое предотвращает конфликтующие строки по пользовательским операторам — в первую очередь предотвращая перекрывающиеся временные диапазоны (двойные бронирования комнаты/ресурса), мощная возможность, которую стандартное UNIQUE ограничение не может предоставить и которая элегантно решает общую реальную проблему (планирование, резервирования) на уровне базы данных.
Понимание ограничений — стандартные для целостности, гибкие CHECK выражения Postgres и мощные EXCLUDE для предотвращения конфликтов — важно для проектирования баз данных, которые автоматически обеспечивают корректность.
Поскольку целостность данных критична и ограничения обеспечивают гарантии, которые код приложения не может, и поскольку Postgres предлагает мощные опции (богатые CHECK, EXCLUDE для перекрытий) помимо основ, понимание поддержки ограничений PostgreSQL является ценным, практически релевантным знанием для построения надёжных баз данных, причём EXCLUDE ограничение в частности является отличительной, полезной возможностью Postgres, которую стоит знать для систем планирования/резервирования.