Версия источника: 4880e8b4372c96001c2e052be28b68a95d31252b
Синхронизировано: 2026-11-09T11:15:07.649Z
Источник: https://github.com/sergey-from-riders/vibecoding-base/tree/4880e8b4372c96001c2e052be28b68a95d31252b

<a id="database-constraints"></a>

# Ограничения целостности

## Коротко

Проверка в приложении не защищает от конкурирующих запросов и другого клиента БД.

## Плохо

```javascript
if (!emailExists(email)) {
  insertUser(email);
}
```

## Хорошо

```sql
CREATE UNIQUE INDEX users_email_unique
  ON users (email);
```

## Почему

Два запроса могут одновременно пройти проверку отсутствия записи.

## Когда применять

Способ нормализации email и состав уникальности, включая tenant, определяет продукт.

## Как проверить

- Попробуйте два одновременных создания одной сущности.

## Человек

Определяет инварианты данных и допустимые исключения.

## Агент

Готовит схему или миграцию, проверяет граничные значения и совместимость с текущими запросами.

Контроль результата:

- Попробуйте два одновременных создания одной сущности.

## Источники

- [PostgreSQL: Documentation: 18: 5.5. Constraints](https://www.postgresql.org/docs/18/ddl-constraints.html)

Уровень: Обязательно. Проверено: 2026-11-09. Изменено: 2026-11-09.

[Исходный файл](https://github.com/sergey-from-riders/vibecoding-base/blob/4880e8b4372c96001c2e052be28b68a95d31252b/registry/standards/database/postgres/rules/constraints.md)
