3. Усложнение: поддержать дебет/кредит (двойная запись). Cleanup

Для поддержки двойной записи (дебет/кредит) в таблице transactions добавляется колонка type, которая указывает, является ли транзакция дебетом или кредитом.

Короткий ответ

Что ответить на собеседовании

Для поддержки двойной записи (дебет/кредит) в таблице transactions добавляется колонка type, которая указывает, является ли транзакция дебетом или кредитом. При этом сумма amount всегда положительна, а баланс вычисляется с учётом типа:

Подробный разбор

Ответ с пояснениями

Условие

  1. Усложнение: поддержать дебет/кредит (двойная запись). Cleanup

CREATE TABLE accounts ( id BIGSERIAL PRIMARY KEY, owner_id BIGINT NOT NULL, currency VARCHAR(3) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT now() );

CREATE TABLE transactions ( id BIGSERIAL PRIMARY KEY, account_id BIGINT NOT NULL REFERENCES accounts(id), amount NUMERIC(18,2) NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT now() );

CREATE INDEX idx_transactions_account_id ON transactions(account_id);

SELECT COALESCE(sum(amount), 0) AS balance FROM transactions WHERE account_id = :account_id;

ALTER TABLE transactions ADD COLUMN type VARCHAR(6) NOT NULL CHECK (type IN ('debit', 'credit'));

ALTER TABLE transactions DROP CONSTRAINT transactions_amount_check, ADD CONSTRAINT transactions_amount_check CHECK (amount > 0);

SELECT COALESCE( SUM(CASE WHEN type = 'credit' THEN amount WHEN type = 'debit' THEN - amount END) AS balance FROM transactions WHERE account_id = :account_id;

Ответ

Для поддержки двойной записи (дебет/кредит) в таблице transactions добавляется колонка type, которая указывает, является ли транзакция дебетом или кредитом. При этом сумма amount всегда положительна, а баланс вычисляется с учётом типа:

ALTER TABLE transactions
ADD COLUMN type VARCHAR(6) NOT NULL CHECK (type IN ('debit', 'credit'));

ALTER TABLE transactions
DROP CONSTRAINT transactions_amount_check,
ADD CONSTRAINT transactions_amount_check CHECK (amount > 0);

SELECT COALESCE(
  SUM(CASE
    WHEN type = 'credit' THEN amount
    WHEN type = 'debit' THEN -amount
  END), 0) AS balance
FROM transactions
WHERE account_id = :account_id;

Таким образом, кредитные операции увеличивают баланс, а дебетовые уменьшают. Это классический подход для учёта финансовых операций с двойной записью.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку