Этот вопрос является ответом на предыдущий вопрос, который я задавал о том, как лучше всего моделировать различные временные величины и временные рамки:
Как хранить в базе данных даты и сроки возникновения событий для быстрых и элегантных запросов?
Учитывая таблицу событий , я бы хотел самый простой способ моделировать и запрашивать события, которые имеют такие события:
- Единовременно : 12 декабря 2014 года в рокхаусе состоится концерт группы XY Rock
- Ежегодно : Доброволец на суповой кухне утром в День Благодарения
- Ежемесячно : Каждую первую субботу бесплатная ночь в МоМА
- Еженедельно : обычные рабочие часы
Я бродил по схеме в этой форме:
- Имя
- Описание
- start_datetime
- end_datetime
- period_type (строка, например, «Еженедельно», «Ежемесячно»)
- пн (логическое)
- 1042 * Вт *
- ср
- ЧГ
- 1048 * ПТ *
* * Сели тысяча сорок-девять
- солнце (все логические значения)
- расписание (текст)
- частота_ описание (текст)
Обычный сценарий использования, который я предвижу, заключается в том, что в определенный вторник ... скажем, 5/4/2016 я хочу найти все, что происходит в этот вторник ... включая все предприятия, которые открыты по обычным вторникам, все, что происходит ежемесячно во вторник, и все, что происходит в эту конкретную дату.
Таким образом, запрос псевдокода будет выглядеть примерно так:
SELECT * from events WHERE `tues`=TRUE || DATE(start_datetime) = '2016-04-05'
На уровне приложения / контроллера я мог бы применить необходимую логику к исключить все "ежемесячные" события вторника, которые не происходят в первый вторник, используя ключ / хранилище в Frequency_description (для обсуждения я собираюсь проигнорировать «ежегодный» крайний случай, когда что-то случается каждый четвертый четверг ноября или что-то подобное). Было бы неплохо сделать это исключение в запросе, но я не уверен, как спроектировать таблицу, чтобы позволить это, и при этом сохранить простой SELECT.
Я также предсказываю, что нет необходимости делать запрос, в котором я нахожу, что все предприятия открыты во вторник в 9:00 ... Таким образом, отдельные поля дня могут быть просто логическими с эффективным использованием пространства с графиком * Поле 1073 * является датой хранения моей ненормализованной конкретной информации. Приложение будет иметь логику для анализа и форматирования для отображения.
Это перебор? Допустим, 70% моих событий будут одноразовыми, что устраняет необходимость в понедельник, вторник, субботу и т. Д., А также в расписании и в тексте-ключах-хранилищах Frequency_description ...
Должны ли я вместо этого иметь две таблицы? Один для событий, а другой для какого-то события_отношения, в котором соединяются day_fields и key-store-textfields?
Это похоже на более эффективное использование пробела ... с другой стороны, мой запрос должен быть SELECT и JOIN ... который может быть медленнее.
Когда речь идет о количестве записей от 10 до 100 Кб, и при простом хостинге в EC2 ... я должен больше заботиться об эффективном использовании пространства в моей базе данных (не только о чистом пространстве хранения данных, но и всех связанных с этим издержках с текстом поля и многочисленные столбцы) ... или мне нужно больше заботиться о простых операторах SELECT?