Какие типы данных SQL следует использовать для хранения баланса счёта?

«Какие типы данных SQL следует использовать для хранения баланса счёта?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для хранения денежных значений, таких как баланс счёта, критически важны точность и отсутствие ошибок округления. НЕ следует использовать типы с плавающей точкой (FLOAT, REAL, DOUBLE).

Рекомендуемые типы данных:

  1. DECIMAL / NUMERIC (предпочтительный выбор)

    • Точный числовой тип. Хранит числа с фиксированной точностью и масштабом.
    • Идеален для финансовых операций, так как исключает ошибки двоичного представления.
      -- balance DECIMAL(15, 2) - 15 цифр всего, 2 после запятой
      CREATE TABLE account (
      id BIGINT PRIMARY KEY,
      balance DECIMAL(15, 2) NOT NULL DEFAULT 0.00
      );
  2. INTEGER / BIGINT (альтернативный подход)

    • Хранение суммы в минимальных единицах (копейках, центах).
    • Устраняет работу с дробями на уровне базы данных.
      -- Баланс в центах (например, $100.50 хранится как 10050)
      CREATE TABLE account (
      id BIGINT PRIMARY KEY,
      balance_cents BIGINT NOT NULL DEFAULT 0
      );
    • Плюсы: Максимальная производительность и точность целочисленных операций.
    • Минусы: Требует преобразования в бизнес-логике приложения.

Практический совет: Используйте DECIMAL для простоты и ясности. Выберите достаточную точность (например, DECIMAL(19,4) для глобальных операций) и всегда выполняйте денежные расчёты внутри транзакций с соответствующей изоляцией.