Как правильно спроектировать таблицы, чтобы учитывать изменение цен на услуги. Есть две таблицы:
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 обязательно.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Реализована возможность динамического создания полей характеристик для товараЗадача: Сделать фильтр по характеристикам
Работаю с картами, как изначально проставить zoom(примерно так, чтоб было видно только тот город, в котором расположены эти маркеры)?
Всем приветЯ новичок в андроиде, поэтому много чего еще не понимаю
Как читать посимвольно из textarea сразу после введение символов в textarea в java? те