Senior
Existem pedidos que, durante o ciclo de vida, mudam de status. É necessário implementar uma camada de trabalho com o banco de dados: - Guardar o histórico de estados do pedido - Considerar particionamento No futuro, fora do escopo da tarefa atual, serão implementados outros métodos: obtenção de estados por tempo, histórico completo do pedido, etc.
sobes.tech IA
Resposta da IA
Для реализации слоя работы с БД, который сохраняет историю статусов заказов и учитывает партицирование, можно использовать следующую архитектуру:
-
Таблица истории статусов — хранит записи с полями:
order_id,status,changed_at(время изменения), возможноchanged_by(кто изменил), и другие метаданные. -
Партицирование — для масштабируемости и быстрого доступа к данным можно партицировать таблицу по времени (например, по месяцам) или по диапазону order_id, в зависимости от нагрузки и объема данных.
-
Пример структуры таблицы (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');
- В 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
}
- Дальнейшие методы (получение статусов по времени, полная история) можно реализовать с использованием фильтров по
changed_atиorder_id.
Такой подход позволит эффективно хранить и масштабировать историю статусов заказов с возможностью гибкого запроса данных.