Необходимо сохранить несколько значений диапазона дат и получить их через SQL - PullRequest
2 голосов
/ 27 января 2011

Я строю систему аренды жилья.Система хранит профили домов, и пользователи могут бронировать дома в аренду на периоды от одного дня до года.У меня полностью настроена часть бронирования, за исключением того, что я столкнулся с требованием от клиента иметь возможность устанавливать определенные даты и диапазоны дат как недоступные для бронирования для домов.

Дом может быть доступен для целогогод для аренды, или может быть доступен в течение 6 месяцев, или быть недоступным в дискретные дни, например: выходные и праздничные дни для дач и т. д.

Я озадачен тем, как я могу настроить таблицу базы данныххранить эту информацию, учитывая, что информация должна быть получена с помощью SQL-запроса.Я имею в виду следующую ситуацию: дом можно арендовать в течение всего года, кроме среды, 4 июля, 10 ноября - 25 декабря и 31 декабря.

Как мне сохранить это в базе данных ивозможность выполнить запрос, чтобы проверить наличие домов между установленными датами.Я работаю в php MySql

Ответы [ 4 ]

2 голосов
/ 27 января 2011

Существует два различных понятия, которые вы описываете: «по средам» - это не столько диапазон дат, сколько шаблон повторения. То же самое относится и к «выходным».

Возможно, вы смотрите на две разные таблицы в дополнение к вашей таблице свойств, которые определяют эти недоступные даты: одну, которая представляет конкретные диапазоны дат, и одну, которая представляет шаблоны повторения.

                         Property
                            |
              -------------- ---------------
             |                              |
PropertyUnavailableRecurrence PropertyUnavailableRange 

(Имейте в виду, что вы можете выяснить более короткие имена)

PropertyUnavailableRecurrence необходимо хранить информацию, необходимую для превращения «сред» и «выходных» в жизнеспособную логику принятия решений. Я не могу смоделировать это для вас, так как все, что вы представили в этом шаблоне, являются определенными днями недели, но я думаю, что вы должны быть в состоянии учитывать «первое число месяца» или « Вторая среда месяца ", но я не знаю. В любом случае, именно здесь вам необходимо хранить эту информацию.

PropertyUnavailableRange будет просто содержать простые даты From и To, которые определяют диапазон. Эта часть довольно проста.

Конечно, альтернативой было бы взять шаблоны повторений, указанные в приложении, и превратить их в дискретные PropertyUnavailableRange записи, но вам все равно нужно настроить таблицу для хранения этих повторений и связать дискретные записи с повторение, чтобы вы могли управлять ими.

1 голос
/ 27 января 2011

Один из подходов - создать таблицу PropertyUnavailable со следующей структурой:

create table PropertyUnavailable
(
  property_id number not null,
  when        date not null
);

В этой таблице будет указана строка для каждого дня, когда свойство недоступно из-за периода отключения (например, каждую среду, праздничные дни и т. Д.). Я игнорирую, как вы будете хранить метаинформацию шаблона - все, что нужно этой таблице, - это строки для каждого дня, когда свойство недоступно из-за периода отключения электроэнергии.

Я предполагаю, что у вас также будет таблица дней резервирования, PropertyReserved, с такой же структурой, что и выше, плюс внешний ключ для booking_id (или что-то подобное).

Теперь, чтобы увидеть, какие дни недоступны / зарезервированы для данного диапазона дат, sql будет выглядеть примерно так:

SELECT a.when, 'blackout'
FROM PropertyUnavailable a
WHERE a.when between <from_date> to <to_date>
UNION ALL (
SELECT b.when, 'reserved'
FROM PropertyReserved b
WHERE b.when between <from_date> to <to_date>
);

Если с запросом ничего не возвращается, свойство доступно между указанным диапазоном дат (от_даты до_даты).

0 голосов
/ 28 января 2011

Похоже, вы не понимаете, что требуется хранить в базе данных; и что требуется в сегментах кода. Отложите на некоторое время «незарезервированные» даты, предположим, что у вас есть только реальные забронированные даты Catcall имеет смысл. Как выглядит ваш текущий код при поиске доступных дат?

SQL вполне способен обрабатывать даты и выполнять арифметику дат. Мой NonSQL - нет, вам придется хранить больше данных в базе данных, чем в реальном SQL. Но вам не нужно хранить строки на дату. Таблица резервирования требует только FromDate и ToDate.

0 голосов
/ 27 января 2011

Рассматривали ли вы просто бронирование этих "не подлежащих бронированию" дат от имени системы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...