ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых

Как организовать хранение покупок при продаже услуг с разными характеристиками?

Важно: речь о том как хранить покупки, а не товары.

Допустим, мы продаём очень разные по составу услуги. Например
  • право поставить определенную символику на определенный сайт (надо хранить имя svg файла, адрес сайта, даты начала и конца действия услуги). Плюс возможность включить автопродление
  • 10 купонов на посещение определенного ресторана (идентификатор ресторана, процент скидки, количество купонов, даты начала и конца действия услуги)
  • доступ к определённому файлу на сервере (адрес файла, даты начала и конца действия услуги)

Услуги взяты от балды, главное - их полная несовместимость друг с другом.

У меня в голове два варианта - одна широкая таблица со всеми характеристиками всех товаров, или по таблице на услугу.
То есть в любом случае при добавлении услуги придется редактировать схему БД.
Оба варианта мне, понятное дело, не нравятся, но ни выбрать между ними, ни придумать что-то другое я не могу.
JSON не рассматриваю, поскольку нужны джойны с характеристиками товаров (id ресторана например), хотя если будет серьёзная аргументация, то будем брать значение из джейсона.
По этой же причине не рассматриваю недобд типа монги - мне это в существующую базу данных надо встроить - с пользователями, ресторанами, и прочим.
  • Вопрос задан
  • 167 просмотров
Пригласить эксперта
Ответы на вопрос 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
У меня был проект с такой задачей (и тоже ресторанный). Особенностей у него три:
  • "магазины" могут закрываться, а набор товаров полностью меняется несколько раз в год;
  • заказов относительно немного, 200-400 тысяч в год;
  • история нужна для личного кабинета и набор полей там довольно ограничен.

Исходя из этого, выбрали именно JSON, в который складывались все связанные модели ("магазин", "товар" и т.п.) в сериализованном виде. В таком виде они хранятся год-два на всякий случай, потом старые записи переносятся в архивную таблицу, где только реально используемые на странице истории поля со скалярными типами (путь к картинке, название "магазина" и т.п.).

Но тут надо бы реальную задачу понимать. Может, не надо джойнить, а проще денормализовать данные и вести отдельные таблицы какой-то статистики? Или просто отдельно хранить те поля, по которым предполагается джойнить, а всё остальное пихать в JSON?
В отрыве от конкретных задач вариант широкой "дырявой" таблицы мне кажется самым плохим, вариант с таблицей покупки, к которой полиморфично (properties_type, properties_id) привязаны таблицы со значениями свойств каждого типа сущности выглядит немного лучше.
Ответ написан
NikFaraday
@NikFaraday
Student full-stack Developer
Самый простой способ просто вынести общие параметры, такие как [конец действия] в отдельную таблицу [услуг]. А далее все таблицы, что нужно соединить с ней в формате one-to-many

customizations
 - id:uuid unique
 - image_name:varchar
 - image_extention:varchar
 - site_url:varchar
 - service_fk:uuid unique

coupons
 - id:uuid unique
 - discount:float
 - ticket_count:integer
 - restaurant_fk
 - service_fk:uuid unique

accesses
 - id:uuid unique
 - file_url:varchar
 - service_fk:uuid unique

services:
 - id:uuid unique
 - date_start:timestamp
 - date_end:timestamp


При выборке делаете просто JOIN и получаете нужные таблицы в связке
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы