Задать вопрос
Phoen1xx
@Phoen1xx

Как ограничить число отношений к записи?

Здравствуйте. Мне требуется создать между таблицами отношение один к N. Я пишу тестовый сайт, на котором можно забронировать столик в ресторане. У меня возникла проблема при работе с таблицами:
restaurant
reserved
В restaurant хранится описание ресторана, а также число столиков. Когда пользователь бронирует столик, создается запись в reserved, со ссылкой на id ресторана, но получается что можно создать любое кол-во броней.

Я хотел делать запрос к бд для получения максимального кол-ва столов, а также получать имеющийся брони, чтобы посчитать хватает ли места, но тогда в случае медленной работы моей программы, может получится ситуация, что мест уже нету, а я добавляю еще одну бронь. Хотелось бы переложить этот вопрос на базу данных.
  • Вопрос задан
  • 120 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 2
DevMan
@DevMan
Читаем о транзакциях.
Ответ написан
Phoen1xx
@Phoen1xx Автор вопроса
Оказалось способа сделать это на стороне бд нету, и максимум что можно сделать, это при помощи транзакций гарантировать целостность данных.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@bioroot
На самом деле очень интересный вопрос. Логику, которую вам предлагают выше, всё-равно придётся использовать. Т.е. начинаем транзакцию, пробуем воткнуть данные, если что-то пошло не так - откатываем транзакцию. Но, насколько я вас понял, в первую очередь вам не нравится, что ограничения на количество мест придётся выносить в код, и откатывать транзакцию тоже из кода. Это нормальная практика, но если очень хочется вынести ограничения в базу - посмотрите в сторону CONSTRAINT. Правда есть эта штука только в последней версии MySQL (в PostgreSQL есть давно). С помощью этих проверок вы можете, например, создать колонку с количеством свободных мест в ресторане и потребовать, чтобы оно было не отрицательно. Тогда на уровне кода вам нужно будет только не забыть скрутить на единицу счётчик свободных мест. Если ограничение будет нарушено, то база плюнет ошибкой и транзакция откатится.
Ответ написан
Комментировать
tsklab
@tsklab
Здесь отвечаю на вопросы.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Как именно пользователь бронирует столик? Скорее всего на определённое время, то есть, например, с 15 до 18. При этом, наверняка, есть некоторый шаг бронирования (например, 1 час). Соответственно, появляются слоты 15, 16, 17 часов.
Значит в таблицу записывается id столика и временной слот бронирования. Создаётся уникальный ключ (id_столика, слот). Запись всех слотов делается в рамках одной транзакции, тогда никто не сможет вклиниться в процедуру сохранения бронирования.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы