Как добавить базу данных в приложение (и не потерять данные потом)
Чтобы добавить базу данных в приложение, выберите управляемую реляционную базу (обычно берут Postgres), храните строку подключения в секретах на сервере, создайте одну таблицу на каждый вид данных, которые хранит приложение, и пусть ваш бэкенд, а не браузер, читает из неё и пишет в неё. Если вы собираете приложение с помощью ИИ-конструктора, обычно достаточно сказать «сохрани это в базу данных», и агент настроит таблицы и код. Ваша задача — ясно описать данные и проверить, что они действительно сохраняются.
В этом гиде: когда нужна база данных, основные варианты, как описать свои данные и ошибки, из-за которых теряются или утекают данные.
Когда приложению нужна база данных
База данных нужна, когда приложению надо запомнить что-то после того, как страницу закрыли, или поделиться данными между людьми. Типичные признаки:
- Посетители что-то отправляют: форму, регистрацию, бронь, заказ
- У пользователей есть аккаунты с сохранённым собственным контентом
- Администратор должен видеть или редактировать то, что создали другие
- Нужны отчёты или подсчёты за период
Она не нужна для статичного сайта, где все видят один и тот же контент, например портфолио или простой лендинг. Если вы не уверены, что такое база данных, сначала прочитайте что такое база данных.
Ваши варианты
| Вариант | Что это | Для чего подходит | Компромиссы |
|---|---|---|---|
| Встроенная база от ИИ-конструктора | База, созданная и подключённая для вашего проекта | Большинство приложений, собранных с ИИ-конструктором | Привязана к хостингу платформы; экспорт и резервные копии зависят от платформы |
| Управляемый Postgres или MySQL | Размещённая реляционная база, которую вы подключаете отдельно | Приложения, которые вы хостите сами или которыми пользуются несколько сервисов | Ключи, лимиты подключений и тарифы настраиваете вы |
| Backend-as-a-service | База данных плюс авторизация, хранилище и API в одном продукте | Фронтенд-приложения, которым нужен готовый вход | Больше специфичных для сервиса понятий, которые надо освоить |
| Документная (NoSQL) база | Хранит гибкие документы в формате JSON | Очень неоднородные данные | Связи и отчёты делать сложнее |
| Таблица как база | Google Таблицы или аналоги через API | Маленькие внутренние инструменты, прототипы | Медленно, нет нормальных ограничений, ломается при одновременных правках |
Для большинства небольших и средних веб-приложений правильный выбор по умолчанию — реляционная база вроде Postgres. Она хорошо справляется со связями (у клиента много заказов), поддерживает целостность данных и позволяет потом отвечать на вопросы с помощью SQL. Понятное объяснение Postgres — в гиде что такое Postgres.
Опишите данные до начала сборки
Самое полезное, что можно сделать, — записать сущности, которые хранит приложение, и как они связаны. Знать терминологию баз данных не нужно. Для приложения бронирования это может выглядеть так:
- Клиенты: имя, email, телефон
- Услуги: название, длительность, цена
- Брони: какой клиент, какая услуга, время начала, статус (ожидает, подтверждена, отменена)
Это три таблицы. «Какой клиент» и «какая услуга» становятся связями (внешними ключами) между ними. Правильная структура на раннем этапе важнее любого выбора технологии, потому что менять форму данных, в которых уже есть реальные записи, сложнее, чем поменять верстку страницы.
Несколько практических правил:
- Одна таблица на один вид сущности. Не запихивайте заказы в текстовое поле у клиента.
- У каждой строки должны быть ID и время создания. Они понадобятся позже.
- Используйте правильные типы. Даты — как даты, деньги — как целые копейки или десятичное число, а не как текст.
- Помечайте обязательные поля. Пусть базу данных отклоняет плохие данные, а не только форма.
Примеры промптов
Начинайте с одной функции, а не с целой схемы сразу:
Добавь в это приложение базу данных. Создай таблицу bookings с именем клиента, email, услугой, временем начала и статусом (ожидает, подтверждена, отменена; по умолчанию ожидает). Сохраняй заявки из формы бронирования в эту таблицу, показывай сообщение об успехе и добавь страницу для администратора, где бронирования выводятся от новых к старым.
Потом расширьте:
Добавь таблицу services (название, длительность в минутах, цена в копейках). Замени свободное текстовое поле услуги в бронированиях на связь с services и перенеси существующие бронирования, ничего не удаляя.
И ужесточите:
Убедись, что все чтения и записи в базу выполняются на сервере. Браузер никогда не должен получать строку подключения к базе. Проверяй email и время начала на сервере до вставки записи.
Пошагово
- Составьте список данных как выше: сущности, поля, связи между ними.
- Создайте базу. В ИИ-конструкторе попросите об этом в чате. В другом месте создайте управляемый экземпляр Postgres и скопируйте строку подключения.
- Сохраните строку подключения как секрет (переменную окружения на сервере), а не в коде. См. переменные окружения и секреты.
- Создайте таблицы. Используйте миграции — версионированные скрипты, которые меняют схему, чтобы изменения были повторяемыми и обратимыми.
- Постройте серверные маршруты, которые создают, читают, обновляют и удаляют строки (CRUD). Браузер вызывает эти маршруты и никогда не обращается к базе напрямую.
- Подключите интерфейс к этим маршрутам: формы, которые сохраняют, списки, которые загружаются, пустые состояния, когда данных ещё нет.
- Проверьте сохранение. Отправьте что-нибудь, перезагрузите страницу, откройте в другом браузере. Если данных нет, значит, они не сохранились в базе.
- Проверьте доступ. Войдите вторым пользователем и убедитесь, что не видите и не меняете данные первого.
- Опубликуйте и проверьте снова на живом адресе, потому что опубликованное приложение может использовать другое подключение, чем предпросмотр.
Частые ошибки
- Сохранять в браузер и считать, что данные сохранены. localStorage выглядит рабочим, пока кто-то не откроет приложение на другом устройстве. Всегда проверяйте во втором браузере.
- Класть строку подключения во фронтенд-код. Любой может прочитать фронтенд-код. Это даёт доступ ко всей вашей базе.
- Нет проверок доступа. «Покажи мои заказы» должно фильтровать по вошедшему пользователю на сервере, а не в интерфейсе. Это самая частая дыра в безопасности в приложениях, собранных с ИИ; наш чек-лист безопасности её разбирает.
- Деструктивные изменения схемы. Просьба «переименовать таблицу» или «поменять структуру» может удалить её и создать заново. Если есть реальные данные, пишите: «перенеси существующие строки, ничего не удаляй».
- Хранить файлы в базе. Картинки и PDF должны лежать в файловом хранилище, а в таблице — только их адрес или ключ. См. как добавить загрузку файлов.
- Нет резервных копий. До появления клиентов узнайте, как платформа делает бэкапы и как их восстановить.
Чек-лист
- У каждого вида сущностей своя таблица с ID и временем создания
- Обязательные поля и типы проверяются самой базой данных
- Строка подключения хранится только в секретах на сервере
- Все чтения и записи идут через серверные маршруты
- Каждый пользователь может читать и менять только свои строки
- Данные переживают перезагрузку и видны в другом браузере
- Изменения схемы выполняются миграциями и сохраняют существующие строки
- Вы знаете, как работают резервные копии и восстановление
- Живое приложение проверено после публикации
Добавление базы данных в Mythex
В Mythex у каждого проекта может быть своя выделенная база Postgres — и на Free, и на Pro. Обычно отдельная кнопка «подключить» не нужна: попросите в чате («сохраняй email'ы из листа ожидания в базу данных») или введите /database, и параметры подключения будут добавлены в рабочее пространство и в опубликованное приложение. В настройках проекта видно, активна ли база.
База засыпает после 5 минут простоя и просыпается при следующем запросе. Использование опубликованного приложения списывается только за время, когда база была активна, с того же баланса кредитов, что и сборка. Если базу добавили после публикации, опубликуйте приложение ещё раз, чтобы живая версия её подхватила.
Подробнее — в разделе База данных и в рецепте Создать CRUD-приложение в документации. Про вход и данные отдельных пользователей читайте как добавить вход в приложение.
Вопросы
Нужна ли база данных для моего приложения?
Она нужна, как только приложению надо что-то запоминать между визитами или делиться данными между пользователями: регистрации, заказы, брони, посты или настройки. Статичному сайту, который показывает всем одно и то же, база данных не нужна.
Какую базу данных выбрать для небольшого веб-приложения?
Для большинства небольших веб-приложений надёжный вариант по умолчанию — реляционная база данных, например Postgres. Она хорошо работает с пользователями, заказами, связями между данными и отчётами, широко поддерживается, и при небольшом масштабе вы её почти не перерастёте.
Можно ли хранить данные в браузере вместо базы данных?
Хранилище браузера, например localStorage, живёт только на одном устройстве и в одном браузере, и пользователь может очистить его в любой момент. Оно подходит для настроек вроде выбранной темы, но не для того, что вам или другим пользователям нужно видеть позже.
Есть ли база данных в Mythex?
Да. У каждого проекта Mythex может быть своя выделенная база Postgres на тарифах Free и Pro. Попросите её в чате или используйте команду /database, а параметры подключения будут подставлены автоматически. Использование оплачивается с того же баланса кредитов, что и сборка.