Назад к вопросам
Middle+
4
// [DATABASE] Спроектировать БД пользователей и их электронных кошельков. // Пользователь может владеть несколькими электронными кошельками в разных валютах, но при этом не может владеть двумя кошельками в одной валюте. // Возможные валюты: USD/EUR/RUB. Кошелёк у пользователя должен содержать текущий баланс; // Валюты должны иметь дополнительное название на русском языке.
Компании, где спрашивали
BetBoom
Ответ от нейросети
sobes.tech AI
Для проектирования базы данных пользователей и их электронных кошельков с учётом требований можно использовать следующую структуру:
Таблицы
- users — хранит информацию о пользователях
- id (PK)
- name
- ...
- currencies — справочник валют
- code (PK) — например, 'USD', 'EUR', 'RUB'
- name_ru — название валюты на русском (например, 'Доллар США')
- wallets — электронные кошельки
- id (PK)
- user_id (FK -> users.id)
- currency_code (FK -> currencies.code)
- balance (DECIMAL)
Ограничения
- В таблице wallets необходимо обеспечить уникальность пары (user_id, currency_code), чтобы пользователь не мог иметь два кошелька в одной валюте.
Пример SQL-схемы (PostgreSQL):
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL
);
CREATE TABLE currencies (
code CHAR(3) PRIMARY KEY,
name_ru VARCHAR(255) NOT NULL
);
CREATE TABLE wallets (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL REFERENCES users(id),
currency_code CHAR(3) NOT NULL REFERENCES currencies(code),
balance NUMERIC(19,4) NOT NULL DEFAULT 0,
CONSTRAINT unique_user_currency UNIQUE (user_id, currency_code)
);
-- Пример вставки валют
INSERT INTO currencies (code, name_ru) VALUES
('USD', 'Доллар США'),
('EUR', 'Евро'),
('RUB', 'Российский рубль');
Такой дизайн позволяет:
- Хранить пользователей и их кошельки в разных валютах
- Гарантировать, что у пользователя не будет двух кошельков с одинаковой валютой
- Легко расширять список валют и хранить их русские названия
При работе с кошельками важно обеспечить корректное обновление балансов с учётом транзакций и блокировок для предотвращения гонок данных.