Μοντελοποιήστε ένα απλό τραπεζικό σύστημα: - Πίνακας `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 accounts ( id SERIAL PRIMARY KEY, owner_id INT NOT NULL, currency VARCHAR(3) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW() );
CREATE TABLE transactions ( id SERIAL PRIMARY KEY, account_id INT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE, amount NUMERIC NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT NOW() );
-- 2. Запрос для получения текущего баланса по account_id SELECT account_id, SUM(amount) AS balance FROM transactions WHERE account_id = $1 GROUP BY account_id;
-- 3. Усложнение: поддержка дебет/кредит (двойная запись) -- Для двойной записи добавим таблицу ledger_entries CREATE TABLE ledger_entries ( id SERIAL PRIMARY KEY, transaction_id INT NOT NULL REFERENCES transactions(id) ON DELETE CASCADE, account_id INT NOT NULL REFERENCES accounts(id), amount NUMERIC NOT NULL CHECK (amount <> 0), created_at TIMESTAMP NOT NULL DEFAULT NOW() );
-- В этом случае каждая транзакция будет иметь две записи в ledger_entries: -- дебет (откуда списывается) с отрицательным amount -- кредит (куда зачисляется) с положительным amount
-- Запрос баланса по account_id с учетом ledger_entries SELECT account_id, SUM(amount) AS balance FROM ledger_entries WHERE account_id = $1 GROUP BY account_id;