Я бы в данном случае вынес название товара из 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 мы будем хранить только указанную информацию пользователя