В целом, я бы согласился с предложением Колина Файна о том, чтобы сделать структуру данных ясной и логичной, а потом беспокоиться о производительности - гораздо проще оптимизировать хорошо структурированную, но медленную базу данных, чем поддерживать преждевременно оптимизированную базу данных. ,
Сказав это, ваш вопрос не совсем ясен - но я бы рискнул следующими идеями.
Во-первых, ваши понятия "события" и "исключения" звучат так, как будто они принадлежат друг другу - я бы не стал их размещать в бронировании. Фактически, я думаю, что «бронирование» - это пересечение события и клиента вместе с дополнительной информацией (например, статусом, деталями платежа и т. Д.).
Во-вторых, вы, кажется, беспокоитесь о количестве событий, которые вы создаете; Я не думаю, что вам нужно. Даже если каждый день происходит 10 событий и вы планируете заблаговременно на 10 лет, вы все равно имеете дело только с несколькими десятками тысяч записей - это далеко не за пределами MySQL. Кроме того, поиск в базе данных будет намного проще поддерживать (и, возможно, быстрее), чем сложная логика в PHP, связанная с поиском исключений.
Итак, я бы подумал о создании следующих таблиц:
EventType
ID Description Duration Price
------------------------------------
1 1 day event 1 10
2 2 day event 2 15
EventInstance
ID EventTypeID StartDate EndDate Duration Price
1 1 1 Jan 2012 2 Jan 2012 1 10 //Regular event
2 1 1 Feb 2012 2 Feb 2012 1 20 //Special price exception
3 1 1 Mar 2012 3 Mar 2012 2 25 //Special duration and price exception
Вы можете заполнить таблицу «EventInstance», просматривая любую логику даты, а затем настраивая записи для «исключений»
Таким образом, на вопрос «что происходит 1 января» можно ответить одним запросом к базе данных, а не логикой, чтобы проверить, является ли 1 января понедельником или первым днем месяца, или високосным годом или без разницы.
Я настоятельно рекомендую создать базовую модель данных, следуя священным принципам проектирования баз данных (сняв ограничение с святого Codd), и, если вы действительно беспокоитесь о производительности, заполните базу данных образцами данных и настройте запросы, которые вы ожидать, чтобы нуждаться.
Вы получите гораздо лучшую информацию и гораздо более точные результаты, работая с фактическими данными и оптимизируя их, чем заботясь о производительности в целом на этой ранней части проекта.