Middle+
3. Complexiteit: ondersteuning van debet/krediet (dubbele boekhouding). Opschoning CREATE TABLE rekeningen ( id BIGSERIAL PRIMARY KEY, owner_id BIGINT NOT NULL, currency VARCHAR(3) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT now() ); CREATE TABLE transacties ( id BIGSERIAL PRIMARY KEY, account_id BIGINT NOT NULL REFERENCES rekeningen(id), amount NUMERIC(18,2) NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT now() ); CREATE INDEX idx_transacties_account_id ON transacties(account_id); SELECT COALESCE(sum(amount), 0) AS balance FROM transacties WHERE account_id = :account_id; ALTER TABLE transacties ADD COLUMN type VARCHAR(6) NOT NULL CHECK (type IN ('debit', 'credit')); ALTER TABLE transacties DROP CONSTRAINT transacties_amount_check, ADD CONSTRAINT transacties_amount_check CHECK (amount > 0); SELECT COALESCE( SUM(CASE WHEN type = 'credit' THEN amount WHEN type = 'debit' THEN - amount ) AS balance FROM transacties WHERE account_id = :account_id;
sobes.tech AI
Antwoord van AI
Для поддержки двойной записи (дебет/кредит) в таблице 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;
Таким образом, кредитные операции увеличивают баланс, а дебетовые уменьшают. Это классический подход для учёта финансовых операций с двойной записью.