Как правильно спроектировать таблицы, чтобы учитывать изменение цен на услуги. Есть две таблицы:
mysql> SHOW COLUMNS FROM services;
+---------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+----------+------+-----+---------+----------------+
| service_id | int(11) | NO | PRI | NULL | auto_increment |
| lesson_id | int(11) | NO | MUL | NULL | |
| service_end | datetime | NO | | NULL | |
| service_start | datetime | NO | | NULL | |
+---------------+----------+------+-----+---------+----------------+
mysql> SHOW COLUMNS FROM lessons;
+--------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+----------------+
| lesson_id | int(11) | NO | PRI | NULL | auto_increment |
| lesson_name | varchar(60) | NO | UNI | NULL | |
| lesson_worth | decimal(20,4) | NO | | NULL | |
+--------------+---------------+------+-----+---------+----------------+
Необходимо, чтобы в таблице services хранились цены до их изменения, если таковые и будут, то есть изменения цен для lessons не задевали имеющиеся строки в services
Нашел решение с таблицей хранящая историю изменения цен (если есть лучше, предложите), то какую цену хранить в services: из таблицы истории или из lessons?
UPD
Пришел к этой модели, исходя из ответа.
mysql> SHOW COLUMNS FROM services;
+---------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+----------+------+-----+---------+----------------+
| service_id | int(11) | NO | PRI | NULL | auto_increment |
| lesson_id | int(11) | NO | MUL | NULL | |
| service_end | datetime | NO | | NULL | |
| service_start | datetime | NO | | NULL | |
+---------------+----------+------+-----+---------+----------------+
mysql> SHOW COLUMNS FROM lessons;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| lesson_id | int(11) | NO | PRI | NULL | auto_increment |
| lesson_name | varchar(60) | NO | UNI | NULL | |
+-------------+-------------+------+-----+---------+----------------+
mysql> SHOW COLUMNS FROM worths;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| worth_id | int(11) | NO | PRI | NULL | |
| lesson_id | int(11) | NO | MUL | NULL | |
| worth | decimal(20,4) | NO | | NULL | |
| worth_date | datetime | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
Ответ
Нашел решение с таблицей хранящая историю изменения цен (если есть лучше, предложите)
По моей практике, таблица с историей изменения - это лучшее решение.
какую цену хранить в services: из таблицы истории или из lessons?
С точки зрения реляционной алгебры, если что-то можно получить из одних таблиц, то не стоит это добавлять в другие. Т.е. в идеале цена должна храниться только в таблице истории цен.
С точки зрения производительности, имеет смысл ту цену, которая читается чаще других (например, актуальную на сегодня, или цену на дату открытия услуги) хранить в основной таблице. Но делать это имеет смысл только если вы уверены, что этот один join с таблицей истории серьезно сказывается на производительности.
Поправка. Если для клиента может предоставляться индивидуальная скидка, то поле с ценой в services обязательно.
Комментариев нет:
Отправить комментарий