Sobes.tech
Middle+

Modelować prosty system bankowy: - Tabela `accounts`: - `id`, - `owner_id`, - `currency`, - `created_at`. - Tabela `transactions`: - `id`, - `account_id`, - `amount`, - `created_at`. **Wymagania:** 1. Napisać SQL do utworzenia schematu z potrzebnymi ograniczeniami (NOT NULL, FK, CHECK na `amount` niezerowe). 2. Napisać zapytanie: - uzyskać bieżący stan konta po `account_id` (suma `amount`). 3. Utrudnienie: obsługa debetu/kredytu (podwójny zapis). Sprzątanie.

sobes.tech AI

Odpowiedź od AI

sql -- 1. Tworzenie schematu CREATE TABLE konta ( id SERIAL PRIMARY KEY, owner_id INT NOT NULL, currency VARCHAR(3) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW() );

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

-- 2. Zapytanie o aktualne saldo dla account_id SELECT COALESCE(SUM(amount), 0) AS balance FROM transakcje WHERE account_id = $1;

-- 3. Utrudnienie: obsługa debetu/kredytu (podwójny zapis) -- Zakłada się, że każda transakcja składa się z dwóch zapisów: debet i kredyt -- W tym celu można dodać tabelę ledger_entries z polami: CREATE TABLE ledger_entries ( id SERIAL PRIMARY KEY, transaction_id INT NOT NULL, account_id INT NOT NULL REFERENCES konta(id), amount NUMERIC NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT NOW(), CONSTRAINT fk_transaction FOREIGN KEY (transaction_id) REFERENCES transakcje(id) ON DELETE CASCADE );

-- Tabela transakcje teraz przechowuje ogólne informacje o transferze (np. opis, data) -- Saldo konta jest obliczane jako suma amount z ledger_entries: SELECT COALESCE(SUM(amount), 0) AS balance FROM ledger_entries WHERE account_id = $1;

"""

W ten sposób, podwójny zapis jest zapewniony przez dwa wpisy w ledger_entries: jeden z ujemnym amount (obciążenie), drugi z dodatnim (uznanie). To klasyczne podejście w rachunkowości systemów bankowych.