Modelujte једноставан банкарски систем: - Табела `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
Odpoveď od AI
sql -- 1. Vytvorenie schémy CREATE TABLE účty ( id SERIAL PRIMARY KEY, owner_id INT NOT NULL, currency VARCHAR(3) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW() );
CREATE TABLE transakcie ( id SERIAL PRIMARY KEY, account_id INT NOT NULL REFERENCES účty(id) ON DELETE CASCADE, amount NUMERIC NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT NOW() );
-- 2. Dotaz na získanie aktuálneho zostatku podľa account_id SELECT COALESCE(SUM(amount), 0) AS balance FROM transakcie WHERE account_id = $1;
-- 3. Zložitejšie: podpora debet/úver (dvojitý zápis) -- Predpokladá sa, že každá transakcia pozostáva zo dvoch záznamov: debet a úver -- Na to možno pridať tabuľu ledger_entries s poliami: CREATE TABLE ledger_entries ( id SERIAL PRIMARY KEY, transaction_id INT NOT NULL, account_id INT NOT NULL REFERENCES účty(id), amount NUMERIC NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT NOW(), CONSTRAINT fk_transaction FOREIGN KEY (transaction_id) REFERENCES transakcie(id) ON DELETE CASCADE );
-- Tabuľka transakcie teraz uchováva všeobecné informácie o prevode (napr. popis, dátum) -- Zostatok na účte sa počíta ako súčet amount z ledger_entries: SELECT COALESCE(SUM(amount), 0) AS balance FROM ledger_entries WHERE account_id = $1;
"""
Takto je zabezpečené dvojité účtovníctvo dvomi záznamami v ledger_entries: jeden s negatívnym amount (výdaj), druhý s pozitívnym (príjem). Ide o klasický prístup v účtovníctve bankových systémov.