Sobes.tech
Senior

Il existe des commandes qui changent d'état au cours de leur cycle de vie. Il est nécessaire de mettre en œuvre une couche de travail avec la base de données : - Enregistrer l'historique des statuts de la commande - Prendre en compte le partitionnement À l'avenir, en dehors du cadre de la tâche actuelle, d'autres méthodes seront implémentées : obtenir les statuts par temps, l'historique complet de la commande, etc.

sobes.tech IA

Réponse de l'IA

Для реализации слоя работы с БД, который сохраняет историю статусов заказов и учитывает партицирование, можно использовать следующую архитектуру:

  1. Таблица истории статусов — хранит записи с полями: order_id, status, changed_at (время изменения), возможно changed_by (кто изменил), и другие метаданные.

  2. Партицирование — для масштабируемости и быстрого доступа к данным можно партицировать таблицу по времени (например, по месяцам) или по диапазону order_id, в зависимости от нагрузки и объема данных.

  3. Пример структуры таблицы (PostgreSQL):

CREATE TABLE order_status_history (
    order_id UUID NOT NULL,
    status VARCHAR(50) NOT NULL,
    changed_at TIMESTAMP NOT NULL,
    changed_by UUID,
    PRIMARY KEY (order_id, changed_at)
) PARTITION BY RANGE (changed_at);

CREATE TABLE order_status_history_2024_01 PARTITION OF order_status_history
    FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');
  1. В Go можно реализовать слой с методами для добавления записи в историю и выборки по разным параметрам. Для записи статуса:
func SaveOrderStatus(ctx context.Context, db *sql.DB, orderID string, status string, changedBy string) error {
    query := `INSERT INTO order_status_history (order_id, status, changed_at, changed_by) VALUES ($1, $2, NOW(), $3)`
    _, err := db.ExecContext(ctx, query, orderID, status, changedBy)
    return err
}
  1. Дальнейшие методы (получение статусов по времени, полная история) можно реализовать с использованием фильтров по changed_at и order_id.

Такой подход позволит эффективно хранить и масштабировать историю статусов заказов с возможностью гибкого запроса данных.