> Как хранить историю изменений цен акций в базе данных (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: BrightPattern
Стек: Go
> Пример ответа
Для хранения истории изменений цен акций в Go с использованием реляционной БД (например, PostgreSQL) оптимально подходит таблица с временными метками и поддержкой уникальности по паре (тикер, время). Пример схемы:
SQLCREATE TABLE stock_prices (id BIGSERIAL PRIMARY KEY,ticker VARCHAR(10) NOT NULL,price DECIMAL(18, 6) NOT NULL,recorded_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),UNIQUE (ticker, recorded_at));CREATE INDEX idx_stock_prices_ticker_time ON stock_prices (ticker, recorded_at DESC);
В Go для вставки и запросов используйте database/sql с параметризованными запросами:
GOtype StockPrice struct {Ticker stringPrice float64RecordedAt time.Time}// Вставка с игнорированием дубликатовfunc InsertPrice(db *sql.DB, sp StockPrice) error {_, err := db.Exec(`INSERT INTO stock_prices (ticker, price, recorded_at)VALUES ($1, $2, $3)ON CONFLICT (ticker, recorded_at) DO NOTHING`,sp.Ticker, sp.Price, sp.RecordedAt,)return err}// Получение истории за периодfunc GetHistory(db *sql.DB, ticker string, from, to time.Time) ([]StockPrice, error) {rows, err := db.Query(`SELECT ticker, price, recorded_atFROM stock_pricesWHERE ticker = $1 AND recorded_at BETWEEN $2 AND $3ORDER BY recorded_at ASC`,ticker, from, to,)if err != nil {return nil, err}defer rows.Close()var prices []StockPricefor rows.Next() {var sp StockPriceif err := rows.Scan(&sp.Ticker, &sp.Price, &sp.RecordedAt); err != nil {return nil, err}prices = append(prices, sp)}return prices, nil}
Для высокой нагрузки рассмотрите партиционирование по месяцам (PARTITION BY RANGE (recorded_at)) и использование TimescaleDB с гипертаблицами. При большом объёме данных (миллионы записей) добавьте кэширование последних цен через Redis.
> Похожие задачи по Go
Используется ли продукт конечными пользователями или это бета/альфа версия
Как решаются вопросы инфраструктуры и поддержки
Как организовать запись данных из WebSocket в базу данных и кэш
Как использовать паттерн outbox для обработки задержек записи в базу и обеспечения отказоустойчивости
> Похожие задачи по backend
Используется ли продукт конечными пользователями или это бета/альфа версия
Как решаются вопросы инфраструктуры и поддержки
Как организовать запись данных из WebSocket в базу данных и кэш
Как использовать паттерн outbox для обработки задержек записи в базу и обеспечения отказоустойчивости
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью