Как правильно хранить данные заказов в БД?
Нет, дублировать данные в реляционной БД - не логично. Про нормализацию есть много умных книжек, но общее представление можно составить и по википедии.
Денормализация применяется в тех случаях, когда очень-очень нужно что-то оптимизировать.
habrahabr.ru/post/64524
habrahabr.ru/post/103021
Если вам очень хочется складывать всё в одну кучку посмотрите в сторону no-sql баз. MongoDB, и сородичи, например.
Я бы в данном случае вынес название товара из products в отдельную таблицу pruduct_names со следующей структурой:
- id
- product_id
- name
- datetime
Таким образом, при обновлении названий товаров мы просто добавляем запись в pruduct_names, и если нужно узнать актуальное название товара: SELECT name FROM pruduct_names WHERE product_id=? ORDER BY id DESC LIMIT 1
Если нужно узнать как назывался товар в момент заказа - делаем запрос:SELECT name FROM pruduct_names WHERE product_id=? AND datetime<ORDER_DATE ORDER BY id DESC LIMIT 1
, где ORDER_DATE - дата заказа
Аналогично с данными пользователя (если эти данные у вас "одноразовые" - только для одного заказа), которые также можно запихать в отдельную таблицу (orders_data):
- id
- order_id
- type_id //ID из таблицы orders_data_types
- value
И связанную таблицу с типами данных для заказа (orders_data_types):
- id
- name
Таким образом в orders_data мы будем хранить только указанную информацию пользователя