Как хранить данные
В мобильном приложении может понадобиться работать с различными данными, которые нужно где-то хранить, например:
- код-пароль для входа в приложение (разумеется не в чистом виде)
- файлы, которые юзер скачал через приложение
- коллекции однотипных элементов
- новости
- сообщения
- посты в ленте
- и тд
Все эти данные следует хранить по разному, сейчас разберемся как.
Какие данные хранить в БД
Как вы знаете, база данных представляет из себя набор таблиц, в элементах которых как раз и находятся те данные, которые мы сохранили в БД.
Важно понимать, что в базе данных нужно хранить именно повторяющиеся структуры, которые использует приложение, например:
- объект
Order
для приложения-ресторана, чтобы собирать статистику по количеству заказов в месяц - объект
News
для отображения новостей в социальных сетях, чтобы даже при отсутствии интернета юзеру можно было показать прошлые новости - объект
Message
- сообщение в чате, чтобы также при отсутствии интернета юзер смог прочитать прошлые сообщения
В базе данных не стоит хранить файлы (картинки, электронные книги, документы и тд) потому что она не предназначена для хранения файлов.
Основная цель БД - организовать быстрый доступ к конкретным записям и возможность поиска по этим записям.
Если мы будем хранить в БД большой файл, то, во-первых, придется получать файлы из базы данных, что в принципе противоречит ее назначению, так еще и будет сильно тормозить ее работу. Во-вторых - сортировать по бинарному файлу у нас не будет абсолютно никакой возможности. Ну и в-третьих, незачем изобретать велосипед, когда для хранения файлов есть файловая система.
Однако, мы можете хранить в базе данных пути до этих файлов, либо же их названия.
Какие данные хранить в KeyValue
Вспомните, как мы работаем с KeyValue
хранилищем на проектах.
Предназначение KeyValue
хранилища в том, чтобы хранить там только те данные, которые в конкретный момент времени могут быть только в единственном экземпляре, например:
- код-пароль, который юзер задал при первом входе в приложение
- email и пароль
- id текущего заказа
- и тд.
Например, мы хотим знать id текущего заказа. Для этого мы добавили столбец в БД - isCurrentOrder
. Во время разработки логики мы ошиблись и в какой-то момент у нас оказалось две записи в БД с isCurrentOrder = true - ошибка.
Поэтому, вместо БД для таких флагов мы будем использовать хранилище KeyValue
, которое гарантирует единственность значения по конкретному ключу.
Также, в KeyValue
не должно быть коллекций и списков, потому что множества нужно хранить в БД.
Какие данные хранить в файлах
Большие файлы должны сохраняться как файлы, чтобы их можно было читать и записывать потоково, чтобы не забивать оперативную память устройства. Читать и записывать потоково в БД мы не можем, а в файл - можем.
Отличия Sql от NoSql
Прочитайте статью про разницу между SQL и NoSQL базами данных.
Пример реляционной базы данных - SQLDelight (описание), нереляционной - MongoDB Realm (описание)