Страницы

Поиск по вопросам

четверг, 13 июня 2019 г.

История цен. Как правильно? MySQL

Как правильно спроектировать таблицы, чтобы учитывать изменение цен на услуги. Есть две таблицы:
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 обязательно.

Комментариев нет:

Отправить комментарий