> Как хранить историю изменений цен акций в базе данных (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: BrightPattern

Стек: Go

> Пример ответа

Для хранения истории изменений цен акций в Go с использованием реляционной БД (например, PostgreSQL) оптимально подходит таблица с временными метками и поддержкой уникальности по паре (тикер, время). Пример схемы:

SQL
CREATE 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 с параметризованными запросами:

GO
type StockPrice struct {
Ticker string
Price float64
RecordedAt 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_at
FROM stock_prices
WHERE ticker = $1 AND recorded_at BETWEEN $2 AND $3
ORDER BY recorded_at ASC`,
ticker, from, to,
)
if err != nil {
return nil, err
}
defer rows.Close()
var prices []StockPrice
for rows.Next() {
var sp StockPrice
if 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.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью