Как выбрать базу данных для хранения аккаунтов
Что проверяют
Умеете ли вы идти от свойств данных к выбору хранилища, а не называть модную базу. Аккаунты это типичный случай, где нужны уникальность, транзакции и безопасность. Следом обычно спрашивают, как хранить пароли и что будет, когда пользователей станет в сто раз больше.
Как отвечать
Начните с требований к данным:
- структура: у аккаунта жёсткая схема и связи с ролями, сессиями, профилем, заказами. Это реляционная модель;
- целостность: логин и email уникальны, регистрация и смена данных атомарны. Нужны ACID-транзакции и уникальные ограничения;
- нагрузка: чтение по ключу при входе и запросах, запись редкая. Десятки миллионов аккаунтов для одного экземпляра PostgreSQL с индексами обычный объём;
- безопасность и закон: это персональные данные. По 152-ФЗ данные граждан РФ при сборе должны храниться в базах на территории России, плюс шифрование, резервные копии и аудит доступа.
Вывод по умолчанию: PostgreSQL. В Java-стеке это Spring Data JPA или jOOQ, миграции через Flyway или Liquibase, пул HikariCP. Email уникален без учёта регистра: индекс по lower(email) или тип citext. Пароли только медленным хэшем с солью: BCryptPasswordEncoder или Argon2PasswordEncoder из Spring Security.
Масштабирование по шагам: реплики на чтение, кэш профилей, партиционирование и только потом шардирование по user_id. Рядом появляются хранилища под свои задачи: сессии и одноразовые коды в Redis с TTL, гибкие атрибуты профиля в jsonb той же базы.
Сильный ход: спросить, нужно ли вообще хранить аккаунты самим. Провайдер вроде Keycloak даёт вход, 2FA и OAuth из коробки, а своя таблица остаётся только для профиля.
Где спотыкаются
Берут MongoDB или Cassandra «ради масштабирования». Аккаунтам нужны уникальность и транзакции, а объёмов, с которыми реляционная база не справится, у большинства проектов нет.
Хранят пароли в MD5 или SHA-256, пусть даже с солью. Быстрый хэш перебирается на видеокарте, нужен медленный алгоритм с настраиваемой стоимостью.
Забывают про регистр и нормализацию email. Тогда один человек заводит два аккаунта, а письмо для сброса пароля уходит не туда.