Sobes.tech
Middle+

Моделирайте прост банкова система: - Таблица `accounts`: - `id`, - `owner_id`, - `currency`, - `created_at`. - Таблица `transactions`: - `id`, - `account_id`, - `amount`, - `created_at`. **Изисквания:** 1. Напишете SQL за създаване на схемата с необходимите ограничения (NOT NULL, FK, CHECK за ненулев `amount`). 2. Напишете заявка: - да получите текущия баланс на сметката по `account_id` (сумата `amount`). 3. Усложнение: поддържайте дебит/кредит (двойна запис). Почистване.

sobes.tech AI

Отговор от AI

sql -- 1. Създаване на схема CREATE TABLE сметки ( id SERIAL PRIMARY KEY, owner_id INT NOT NULL, currency VARCHAR(3) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW() );

CREATE TABLE транзакции ( id SERIAL PRIMARY KEY, account_id INT NOT NULL REFERENCES сметки(id) ON DELETE CASCADE, amount NUMERIC NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT NOW() );

-- 2. Запитване за получаване на текущия баланс по account_id SELECT COALESCE(SUM(amount), 0) AS balance FROM транзакции WHERE account_id = $1;

-- 3. Усложнение: поддръжка на дебит/кредит (двойно записване) -- Предполага се, че всяка транзакция се състои от два записа: дебит и кредит -- За това може да се добави таблицата ledger_entries с полета: CREATE TABLE ledger_entries ( id SERIAL PRIMARY KEY, transaction_id INT NOT NULL, account_id INT NOT NULL REFERENCES сметки(id), amount NUMERIC NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT NOW(), CONSTRAINT fk_transaction FOREIGN KEY (transaction_id) REFERENCES транзакции(id) ON DELETE CASCADE );

-- Таблицата транзакции сега съхранява обща информация за превода (например, описание, дата) -- Балансът по сметката се изчислява като сумата от amount в ledger_entries: SELECT COALESCE(SUM(amount), 0) AS balance FROM ledger_entries WHERE account_id = $1;

"""

По този начин, двойното записване се осигурява чрез два записа в ledger_entries: един с отрицателен amount (разход), друг с положителен (приход). Това е класически подход към счетоводството в банковите системи.