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

285
12 мая 2017, 15:32

Как правильно спроектировать таблицы, чтобы учитывать изменение цен на услуги. Есть две таблицы:

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    |       |
+------------+---------------+------+-----+---------+-------+
Answer 1

Нашел решение с таблицей хранящая историю изменения цен (если есть лучше, предложите)

По моей практике, таблица с историей изменения - это лучшее решение.

какую цену хранить в services: из таблицы истории или из lessons?

С точки зрения реляционной алгебры, если что-то можно получить из одних таблиц, то не стоит это добавлять в другие. Т.е. в идеале цена должна храниться только в таблице истории цен.

С точки зрения производительности, имеет смысл ту цену, которая читается чаще других (например, актуальную на сегодня, или цену на дату открытия услуги) хранить в основной таблице. Но делать это имеет смысл только если вы уверены, что этот один join с таблицей истории серьезно сказывается на производительности.

Поправка. Если для клиента может предоставляться индивидуальная скидка, то поле с ценой в services обязательно.

READ ALSO
Выборка по точным вхождениям

Выборка по точным вхождениям

Реализована возможность динамического создания полей характеристик для товараЗадача: Сделать фильтр по характеристикам

240
Проставить изначальный zoom

Проставить изначальный zoom

Работаю с картами, как изначально проставить zoom(примерно так, чтоб было видно только тот город, в котором расположены эти маркеры)?

280
Взаимодействие между *.java-классами

Взаимодействие между *.java-классами

Всем приветЯ новичок в андроиде, поэтому много чего еще не понимаю

248
Как читать посимвольно из textarea в java

Как читать посимвольно из textarea в java

Как читать посимвольно из textarea сразу после введение символов в textarea в java? те

427