Modelați un sistem bancar simplu: - Tabelul `accounts`: - `id`, - `owner_id`, - `currency`, - `created_at`. - Tabelul `transactions`: - `id`, - `account_id`, - `amount`, - `created_at`. **Cerinte:** 1. Scrieți SQL pentru crearea schemei cu restricțiile necesare (NOT NULL, FK, CHECK pe `amount` nenul). 2. Scrieți o interogare: - obțineți soldul curent al contului după `account_id` (suma `amount`). 3. Dificultate suplimentară: suport pentru debit/credit (înregistrare dublă). Curățenie.
sobes.tech AI
Răspuns de la AI
sql -- 1. Crearea schemei CREATE TABLE conturi ( id SERIAL PRIMARY KEY, owner_id INT NOT NULL, currency VARCHAR(3) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW() );
CREATE TABLE tranzactii ( id SERIAL PRIMARY KEY, account_id INT NOT NULL REFERENCES conturi(id) ON DELETE CASCADE, amount NUMERIC NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT NOW() );
-- 2. Interogare pentru obținerea soldului curent după account_id SELECT COALESCE(SUM(amount), 0) AS balance FROM tranzactii WHERE account_id = $1;
-- 3. Complexitate: suport pentru debit/credit (înregistrare dublă) -- Se presupune că fiecare tranzacție constă din două înregistrări: debit și credit -- Pentru aceasta, se poate adăuga tabelul ledger_entries cu câmpurile: CREATE TABLE ledger_entries ( id SERIAL PRIMARY KEY, transaction_id INT NOT NULL, account_id INT NOT NULL REFERENCES conturi(id), amount NUMERIC NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT NOW(), CONSTRAINT fk_transaction FOREIGN KEY (transaction_id) REFERENCES tranzactii(id) ON DELETE CASCADE );
-- Tabela tranzactii acum stochează informații generale despre transfer (de exemplu, descriere, dată) -- Soldul contului se calculează ca suma amount din ledger_entries: SELECT COALESCE(SUM(amount), 0) AS balance FROM ledger_entries WHERE account_id = $1;
"""
Astfel, înregistrarea dublă este asigurată prin două înregistrări în ledger_entries: una cu amount negativ (debit), alta cu pozitiv (credit). Aceasta este o abordare clasică în contabilitatea sistemelor bancare.