У меня был проект с такой задачей (и тоже ресторанный). Особенностей у него три:
- "магазины" могут закрываться, а набор товаров полностью меняется несколько раз в год;
- заказов относительно немного, 200-400 тысяч в год;
- история нужна для личного кабинета и набор полей там довольно ограничен.
Исходя из этого, выбрали именно JSON, в который складывались все связанные модели ("магазин", "товар" и т.п.) в сериализованном виде. В таком виде они хранятся год-два на всякий случай, потом старые записи переносятся в архивную таблицу, где только реально используемые на странице истории поля со скалярными типами (путь к картинке, название "магазина" и т.п.).
Но тут надо бы реальную задачу понимать. Может, не надо джойнить, а проще денормализовать данные и вести отдельные таблицы какой-то статистики? Или просто отдельно хранить те поля, по которым предполагается джойнить, а всё остальное пихать в JSON?
В отрыве от конкретных задач вариант широкой "дырявой" таблицы мне кажется самым плохим, вариант с таблицей
покупки
, к которой полиморфично (
properties_type
,
properties_id
) привязаны таблицы со значениями свойств каждого типа сущности выглядит немного лучше.