Лучший способ запросить события календаря? - PullRequest
0 голосов
/ 09 апреля 2009

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

Моя база данных настроена с использованием трех таблиц:

  1. Обычное расписание - используется для создания массива для каждого дня недели, в котором указано, сколько сотрудников доступно, сколько часов они доступны и т. Д.
  2. Варианты расписания - если для даты существуют вариации, это переопределяет информацию из массива регулярного расписания.
  3. События - Существующие события, на которые ссылается дата.

На этом этапе код перебирает дни месяца и проверяет две-три вещи на каждый день.

  1. Существуют ли какие-либо изменения в расписании (государственные праздники, короткие часы и т. Д.)?
  2. Какие часы / количество сотрудников доступны на этот день?
  3. (При наличии персонала) Сколько мероприятий уже запланировано на этот день?

Шаг 1 и шаг 3 требуют запроса к базе данных - при условии 30 дней в месяц, это 60 запросов на просмотр страницы.

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

Будем весьма благодарны за любые идеи или предложения о том, как сделать это более эффективно!

Спасибо!

Ответы [ 3 ]

1 голос
/ 09 апреля 2009

Я не могу придумать вескую причину, по которой вам нужно ограничить каждый запрос одним днем. Конечно, вы можете просто выбрать все значения между парой дат.

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

Затем выполните цикл (для каждого дня) для массива, возвращаемого запросом к базе данных.

1 голос
/ 16 апреля 2009

Я столкнулся с такой же проблемой с http://rosterus.com, и мы просто загружаем большую часть данных в массивы вверху страницы, а затем запрашиваем массив для соответствующих данных. После этого страницы загружаются в 10 раз быстрее.

Так что запустите один или два широких запроса, которые соберут все необходимые вам данные, выберите соответствующие ключи и сохранят каждый результат в массив. Затем получите доступ к массиву вместо базы данных. PHP очень гибок с индексированием массивов, вы можете использовать все виды вещей в качестве ключей ... или несколько индексов.

1 голос
/ 09 апреля 2009

Создать таблицу:

t_month (day INT)

INSERT
INTO     t_month
VALUES
         (1),
         (2),
         ...
         (31)

Тогда запрос:

SELECT   *
FROM     t_month, t_schedule
WHERE    schedule_date = '2009-03-01' + INTERVAL t_month.day DAY
         AND schedule_date < '2009-03-01' + INTERVAL 1 MONTH
         AND ...

Вместо 30 запросов вы получаете только один с JOIN.

Другие RDBMS позволяют создавать наборы строк на лету, но MySQL не .

Вы, однако, можете заменить t_month на уродливый

SELECT  1 AS month_day
UNION ALL
SELECT  2
UNION ALL
...
SELECT  31
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...