Skip to main content

Как хранить данные

В мобильном приложении может понадобиться работать с различными данными, которые нужно где-то хранить, например:

  • код-пароль для входа в приложение (разумеется не в чистом виде)
  • файлы, которые юзер скачал через приложение
  • коллекции однотипных элементов
    • новости
    • сообщения
    • посты в ленте
  • и тд

Все эти данные следует хранить по разному, сейчас разберемся как.

Какие данные хранить в БД

Как вы знаете, база данных представляет из себя набор таблиц, в элементах которых как раз и находятся те данные, которые мы сохранили в БД.
Важно понимать, что в базе данных нужно хранить именно повторяющиеся структуры, которые использует приложение, например:

  • объект Order для приложения-ресторана, чтобы собирать статистику по количеству заказов в месяц
  • объект News для отображения новостей в социальных сетях, чтобы даже при отсутствии интернета юзеру можно было показать прошлые новости
  • объект Message - сообщение в чате, чтобы также при отсутствии интернета юзер смог прочитать прошлые сообщения

В базе данных не стоит хранить файлы (картинки, электронные книги, документы и тд) потому что она не предназначена для хранения файлов.
Основная цель БД - организовать быстрый доступ к конкретным записям и возможность поиска по этим записям.

Если мы будем хранить в БД большой файл, то, во-первых, придется получать файлы из базы данных, что в принципе противоречит ее назначению, так еще и будет сильно тормозить ее работу. Во-вторых - сортировать по бинарному файлу у нас не будет абсолютно никакой возможности. Ну и в-третьих, незачем изобретать велосипед, когда для хранения файлов есть файловая система.

Однако, мы можете хранить в базе данных пути до этих файлов, либо же их названия.

Какие данные хранить в KeyValue

Вспомните, как мы работаем с KeyValue хранилищем на проектах.

Предназначение KeyValue хранилища в том, чтобы хранить там только те данные, которые в конкретный момент времени могут быть только в единственном экземпляре, например:

  • код-пароль, который юзер задал при первом входе в приложение
  • email и пароль
  • id текущего заказа
  • и тд.

Например, мы хотим знать id текущего заказа. Для этого мы добавили столбец в БД - isCurrentOrder. Во время разработки логики мы ошиблись и в какой-то момент у нас оказалось две записи в БД с isCurrentOrder = true - ошибка.
Поэтому, вместо БД для таких флагов мы будем использовать хранилище KeyValue, которое гарантирует единственность значения по конкретному ключу.

Также, в KeyValue не должно быть коллекций и списков, потому что множества нужно хранить в БД.

Какие данные хранить в файлах

Большие файлы должны сохраняться как файлы, чтобы их можно было читать и записывать потоково, чтобы не забивать оперативную память устройства. Читать и записывать потоково в БД мы не можем, а в файл - можем.

Отличия Sql от NoSql

Прочитайте статью про разницу между SQL и NoSQL базами данных.
Пример реляционной базы данных - SQLDelight (описание), нереляционной - MongoDB Realm (описание)