Всем привет! Разрабатываю сервис услуг. Имеются такие таблицы с такими полями:
Table service - таблица содержит настройки для сервиса, который будет создаваться;
mysql> describe service;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| location | varchar(255) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
| event_link | varchar(255) | NO | | NULL | |
| event_color | varchar(100) | YES | | NULL | |
| start_period | date | NO | | NULL | |
| end_period | date | NO | | NULL | |
| duration | time | NO | | NULL | |
| buffer_after | time | NO | | NULL | |
| buffer_before | time | NO | | NULL | |
| max_customer | int | NO | | NULL | |
| is_enable | tinyint(1) | NO | | NULL | |
| type | varchar(50) | NO | | NULL | |
| optimization | varchar(50) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
Пример что содержится в таблице:
mysql> select * from service;
+----+---------+----------+-------------+------------+-------------+--------------+------------+----------+--------------+---------------+--------------+-----------+--------------+--------------+
| id | name | location | description | event_link | event_color | start_period | end_period | duration | buffer_after | buffer_before | max_customer | is_enable | type | optimization |
+----+---------+----------+-------------+------------+-------------+--------------+------------+----------+--------------+---------------+--------------+-----------+--------------+--------------+
| 1 | Default | NULL | NULL | default | NULL | 2020-12-20 | 2021-02-19 | 00:40:00 | 00:00:00 | 00:00:00 | 1 | 1 | organization | distribution |
Table intervals_rule - содержит график работ для сервиса:
mysql> describe intervals_rule;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| service_id | int | YES | MUL | NULL | |
| start_time | time | NO | | NULL | |
| end_time | time | NO | | NULL | |
| name_day | varchar(50) | NO | | NULL | |
| type | varchar(50) | NO | | NULL | |
| date | date | YES | | NULL | |
+------------+-------------+------+-----+---------+----------------+
Пример что содержится в таблице intervals_rule
mysql> select * from intervals_rule;
+----+------------+------------+----------+----------+------+------+
| id | service_id | start_time | end_time | name_day | type | date |
+----+------------+------------+----------+----------+------+------+
| 1 | 1 | 09:30:00 | 17:00:00 | Mon | wday | NULL |
| 2 | 1 | 09:30:00 | 17:00:00 | Tue | wday | NULL |
| 3 | 1 | 09:30:00 | 17:00:00 | Thu | wday | NULL |
| 4 | 1 | 09:30:00 | 17:00:00 | Wed | wday | NULL |
| 5 | 1 | 09:30:00 | 17:00:00 | Sat | wday | NULL |
| 6 | 1 | 09:30:00 | 17:00:00 | Sun | wday | NULL |
| 7 | 2 | 09:30:00 | 17:00:00 | Sun | wday | NULL |
+----+------------+------------+----------+----------+------+------+
7 rows in set (0.00 sec)
Table appointment - содержит клиентов, которые записались к сервису:
mysql> describe appointment;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| service_id | int | YES | MUL | NULL | |
| employee_id | int | YES | MUL | NULL | |
| id_customer | int | YES | | NULL | |
| notes | longtext | YES | | NULL | |
| start_time | time | NO | | NULL | |
| end_time | time | NO | | NULL | |
| date | date | NO | | NULL | |
+-------------+----------+------+-----+---------+----------------+
Пример что содержится в таблице:
mysql> select * from appointment;
+----+------------+-------------+-------------+--------+------------+----------+------------+
| id | service_id | employee_id | id_customer | notes | start_time | end_time | date |
+----+------------+-------------+-------------+--------+------------+----------+------------+
| 1 | 1 | 1 | 5 | String | 12:00:00 | 12:40:00 | 2020-12-31 |
+----+------------+-------------+-------------+--------+------------+----------+------------+
С этими таблицами, с таким содержание, все работает хорошо. Все добавляется. Но проблема вот в чем. С такой бд я не смогу получить интервалы времени, которые заняты или свободны.
Для сведения, сервис содержит поле duration, которое описывает длительность работы "сеанса" с клиентом; на один и тот же момент времени может быть лишь один appointment(клиент).
Таблица intervals_rule имеет поля start_time, end_time это поля, которые показывают со скольки и до скольки работает сервис; name_day это имя дня(Mon, Thu, Tue, Wed,Fri,Sat,Sun). То есть таблица отвечает в какой день работает сервис и время работы сервиса.
Мне нужно как-то получить интервалы времени, которые свободны или заняты для сервиса. Типа... имеется день Mon, у него график работы 09:00-17:00, длительность сеанса с клиентом 30 минут. Получаются интервалы времени: 09:00, 09:30, 10:00,10:30,11:00,11:30,12:00 и т.д.. То есть нужно получить интервалы, но некоторые из них могут быть заняты. Как такое реализовать? Получается, что нужно делать еще одну таблицу? Но в таком случает будет очень много записей. К примеру: 1 сервис, у него 7 записей в intervals_rule и у каждой записи из intervals_rule будет по 20 записей в другой таблице с интервалами. Это не слишком много?
Я придумал лишь одно решение. Это создавать еще одну таблицу с интервалами. По другому можно как-то решить эту проблему? Может у меня изначально реализация неверная? Подскажите, пожалуйста