Рабочий лист: Средства проектирования структур БД — ограничения

Дисциплина «ОП.08 Основы проектирования баз данных» — Занятие №22 (СИЭУиП)
Выберите назначенный практический вариант:

Вариант 1. Система бронирования конференц-залов бизнес-центра

Техническое задание: Спроектируйте таблицу conference_room_bookings для автоматизированного учета бронирования залов. Бизнес-требования исключают человеческий фактор и наложения встреч:

  1. Каждая бронь привязана к конкретному номеру зала room_id (INT NOT NULL).
  2. Временной диапазон задается интервальным типом booking_slot (TSRANGE NOT NULL).
  3. Обязательно ограничение CHECK на валидность границ интервала: начало встречи должно быть строго меньше окончания встречи (lower(booking_slot) < upper(booking_slot)), а интервал не должен быть пустым.
  4. Ограничение EXCLUDE USING gist обязано гарантировать, что для одного и того же зала room_id (оператор =) временные интервалы booking_slot ни в коем случае НЕ пересекаются (оператор перекрытия &&).
  5. Укажите подготовительную системную команду активации расширения PostgreSQL, необходимого для поддержки оператора равенства в индексе GiST.

Вариант 2. Регистрация пользователей банковского портала

Техническое задание: Спроектируйте таблицу профилей клиентов интернет-банкинга bank_clients со строгими ограничениями формата персональных данных:

  1. Поле snils (CHAR(14) NOT NULL): валидация формата страхового номера СНИЛС по регулярному выражению POSIX ^\d{3}-\d{3}-\d{3} \d{2}$ (три группы по 3 цифры через дефис, затем пробел и 2 контрольные цифры).
  2. Поля паспорта РФ: passport_series (CHAR(4) NOT NULL) — строго 4 цифры (^\d{4}$), passport_number (CHAR(6) NOT NULL) — строго 6 цифр (^\d{6}$).
  3. Поле birth_date (DATE NOT NULL): ограничение совершеннолетия (клиент должен быть старше 18 лет на момент регистрации: birth_date <= CURRENT_DATE - INTERVAL '18 years').
  4. Поле phone_number (VARCHAR(12) NOT NULL): международный мобильный формат РФ (^\+7\d{10}$).

Вариант 3. Отели и гостиничные комплексы — циклические связи

Техническое задание: Смоделируйте структуру гостиничного комплекса с циклической зависимостью 1:1 / 1:N:

  1. Таблица hotels: поля hotel_id (INT PRIMARY KEY), hotel_name (VARCHAR(100) NOT NULL), presidential_suite_id (INT NOT NULL). Отель обязан иметь главный президентский номер-люкс.
  2. Таблица hotel_rooms: поля room_id (INT PRIMARY KEY), hotel_id (INT NOT NULL REFERENCES hotels(hotel_id)), room_number (VARCHAR(20) NOT NULL). Номер принадлежит отелю.
  3. Возникает парадокс «курицы и яйца»: ни одну таблицу нельзя заполнить первой, так как оба внешних ключа объявлены как NOT NULL.
  4. Требуется настроить внешний ключ hotels.presidential_suite_id REFERENCES hotel_rooms(room_id) как DEFERRABLE INITIALLY DEFERRED для отложенной проверки в конце транзакции.

Вариант 4. Электронный маркетплейс: ценообразование и артикулы

Техническое задание: Спроектируйте каталог товаров интернет-магазина marketplace_goods со сложной бизнес-логикой ограничений:

  1. Поле sku (VARCHAR(20) NOT NULL): артикул товара строго формата 3 заглавные буквы, дефис, 6 цифр (например, 'ELC-109283'). Валидация через POSIX regex.
  2. Поле base_price (NUMERIC(10,2) NOT NULL): базовая стоимость строго больше 0.
  3. Поле discount_percent (NUMERIC(5,2)): процент скидки должен находиться в диапазоне BETWEEN 0 AND 90 (не может быть отрицательным и не может превышать 90%).
  4. Поле sale_price (NUMERIC(10,2)): цена по акции. Если указана, то должна быть строго меньше base_price (sale_price < base_price).
  5. Логическая непротиворечивость: если задана sale_price, то discount_percent не должен быть NULL, и наоборот (связанная пара скидочных реквизитов).
✓ Данные успешно сохранены в LocalStorage