Sobes.tech
Middle+

Modelujte jednostavan bankarski sistem: - Tabela `accounts`: - `id`, - `owner_id`, - `currency`, - `created_at`. - Tabela `transactions`: - `id`, - `account_id`, - `amount`, - `created_at`. **Zahtevi:** 1. Napišite SQL za kreiranje šeme sa potrebnim ograničenjima (NOT NULL, FK, CHECK na nenultu `amount`). 2. Napišite upit: - da dobijete trenutni saldo računa po `account_id` (zbir `amount`). 3. Dodatno: podrška za debet/kredit (dupli zapis). Čišćenje.

sobes.tech АИ

Одговор од АИ

sql -- 1. Kreiranje šeme CREATE TABLE računi ( id SERIAL PRIMARY KEY, owner_id INT NOT NULL, currency VARCHAR(3) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW() );

CREATE TABLE transakcije ( id SERIAL PRIMARY KEY, account_id INT NOT NULL REFERENCES računi(id) ON DELETE CASCADE, amount NUMERIC NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT NOW() );

-- 2. Upit za dobijanje trenutnog stanja po account_id SELECT COALESCE(SUM(amount), 0) AS balance FROM transakcije WHERE account_id = $1;

-- 3. Komplikacija: podrška za debet/kredit (dupli zapis) -- Pretpostavlja se da svaka transakcija sastoji od dva zapisa: debet i kredit -- Za to se može dodati tabela ledger_entries sa poljima: CREATE TABLE ledger_entries ( id SERIAL PRIMARY KEY, transaction_id INT NOT NULL, account_id INT NOT NULL REFERENCES računi(id), amount NUMERIC NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT NOW(), CONSTRAINT fk_transaction FOREIGN KEY (transaction_id) REFERENCES transakcije(id) ON DELETE CASCADE );

-- Tabela transakcije sada čuva opšte informacije o transferu (npr. opis, datum) -- Stanje na računu se računa kao suma amount iz ledger_entries: SELECT COALESCE(SUM(amount), 0) AS balance FROM ledger_entries WHERE account_id = $1;

"""

Na ovaj način, dvostruko knjiženje je osigurano sa dva zapisa u ledger_entries: jedan sa negativnim amount (trošak), drugi sa pozitivnim (prihod). Ovo je klasičan pristup u računovodstvu bankarskih sistema.