Как наилучшим образом организовать хранение истории покупок с использованием MySQL?

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

У меня возникли следующие вопросы:
1. Как можно оптимизировать данную систему?
2. Стоит ли создавать зависимости, чтобы сумма бонусов клиента зависела от таблицы покупок?
3. Может быть, есть какие-то источники, где я могу найти дополнительную информацию по этому вопросу?

Также, я хотел бы обратиться к вопросу о логике таблицы покупок. У меня есть следующие поля: client_id (связана с таблицей клиентов) и operation_type (которая может быть SUB или PLUS). Немного запутанно, потому что даже при списании бонусов, operation_type все равно будет "PLUS", так как бонусы начисляются.

Буду благодарен за ваши ответы и рекомендации.
Изображение к вопросу
Изображение к вопросу
  • 22 октября 2023 г. 15:28
Ответы на вопрос 2
Привет! Вот некоторые рекомендации по организации хранения истории покупок с использованием MySQL:

1. Создайте таблицу "покупки" с полями, такими как purchase_id (primary key), client_id (foreign key, связанный с таблицей клиентов), operation_type (ENUM с значениями SUB и PLUS), date (дата покупки) и amount (сумма покупки).

2. Для оптимизации системы вы можете использовать индексы на полях, по которым часто выполняются запросы или фильтрация данных, например, на поле client_id или date.

3. Чтобы рассчитывать сумму бонусов клиента на основе таблицы покупок, вы можете использовать запросы с группировкой и агрегатными функциями, такими как SUM(). Например, чтобы получить общую сумму покупок клиента, вы можете выполнить следующий запрос:

```sql
SELECT client_id, SUM(amount) AS total_amount
FROM purchases
WHERE client_id = <client_id>
GROUP BY client_id
```

4. Учитывайте ваши бизнес-правила при работе с полями operation_type. В вашем случае, если даже при списании бонусов значение operation_type все равно будет "PLUS", вы можете использовать другое поле, например, "bonus_operation", с ENUM значениями ADD и SUB. Также учтите, что при списании бонусов необходимо учитывать текущий баланс бонусов клиента.

5. Для дополнительной информации и лучших практик по работе с MySQL и организации хранения данных, вы можете обратиться к официальной документации MySQL (https://dev.mysql.com/doc/) или самоучителям по MySQL.

Надеюсь, эти советы помогут вам оптимизировать систему хранения истории покупок с использованием MySQL. Удачи!
operation_type - тип операции (списание или начисление), от которого зависит отображаемый текст на фронте. Значение "PLUS" соответствует начислению, а "SUB" - списанию. Однако это вызывает некоторые вопросы, поскольку даже при списании происходит начисление. Было бы лучше использовать знак минуса для обозначения списания к стоимости покупки, тогда поле operation_type не потребуется, а сумма транзакций будет правильно отображена на фронте.

list_purchase - это необязательное поле, которое является примечанием. Возникает вопрос, стоит ли создавать таблицу для таких небольших и незначительных данных?

Структура покупки в вашей системе странная, поскольку набор итемов нигде кроме необязательного поля не указан. Может возникнуть нарушение принципа KISS (Keep It Simple, Stupid), который предполагает написание кода, легкого для понимания и интерпретации визуального интерфейса. Основной принцип построения структуры реляционных баз данных - соблюдение нормальных форм.

Как бы вы реализовали систему списания и начисления баллов? Этот вопрос является основным.

Какая логика начисления баллов будет использоваться? Для начисления баллов достаточно обновить соответствующую сумму, а для списания - обновить на нужную разницу. В чем здесь вопрос?

Строить зависимости для определения суммы бонусов клиента на основе таблицы покупок - стоит ли это? 

Может быть, существует информация об этом в определенных источниках? 

Есть такое понятие, как "нормальные формы", которые определяют структурирование базы данных. Для вашей практической реализации будут полезны первая, вторая и третья нормальные формы. Например, поле total_purchase нарушает третью нормальную форму, так как можно вычислить его из таблицы покупок.

Относительно наименования полей: в целом, они вполне нормальные, но возможно стоит поменять местами list_purchase и sum_purchase на purchase_list и purchase_sum, также как и начали с purchase_date.
Похожие вопросы