Работал ли с нереляционной БД

Ответ

Да, работал с Firebase Firestore и Realm. Firestore — документоориентированная NoSQL БД, где данные хранятся в коллекциях документов (JSON-подобные структуры). Realm — локальная NoSQL БД для мобильных устройств с поддержкой реактивных запросов.

Пример Firestore:

// Чтение данных
Firebase.firestore.collection("users")
    .document("user123")
    .get()
    .addOnSuccessListener { document ->
        val name = document.getString("name")
    }

Пример Realm:

// Сохранение объекта
realm.executeTransaction { r ->
    val user = r.createObject(User::class.java, "id123")
    user.name = "Alex"
}

Преимущества: горизонтальная масштабируемость, гибкая схема данных, высокая производительность для определенных сценариев.

Ответ 18+ 🔞

А, ну ты про эти базы данных спрашиваешь? Да, сталкивался, конечно. Firestore и Realm — это как два разных зверя, хотя оба вроде как NoSQL. Но, ёпта, разница между ними — просто овердохуища.

Firestore — это такая штука от Гугла, облачная. Представь себе огромный шкаф с кучей ящиков-коллекций, а в каждом ящике лежат бумажки-документы. И на каждой бумажке — куча ключей и значений, как JSON. Всё просто, пока не начнёшь выстраивать связи между этими бумажками — вот тут уже можно мозг сломать, если архитектуру криво продумать. Зато масштабируется нахуй хорошо, это плюс.

А Realm — это уже локальная история, прямо в телефоне живёт. Штука мощная, реактивная — то есть подписался на данные, и они сами к тебе обновляются прилетают, не надо постоянно дергать базу. Удобно, но иногда такая хитрая жопа с миграциями схемы, что волосы дыбом встают.

Вот, смотри, как в Firestore данные тащить:

// Чтение данных
Firebase.firestore.collection("users")
    .document("user123")
    .get()
    .addOnSuccessListener { document ->
        val name = document.getString("name")
    }

Всё вроде просто, ага. Только не забудь про слушатели ошибок, а то прилетит исключение — и приложение накрылось медным тазом. Доверия к сети, блядь, ноль.

А вот в Realm уже по-другому, более по-домашнему:

// Сохранение объекта
realm.executeTransaction { r ->
    val user = r.createObject(User::class.java, "id123")
    user.name = "Alex"
}

Тут уже внутри транзакции работаешь, всё аккуратненько. Главное — не забывать realm закрывать, а то память сожрёт, ядрёна вошь.

В общем, преимущества у обеих — гибкость, скорость на своих сценариях. Но выбирать надо по задаче: если нужно облако и синхронизация между пользователями — Firestore. Если локальный кэш, оффлайн-работа и реактивность в самом приложении — Realm. А можно и вместе использовать, но это уже высший пилотаж, тут без поллитры не разберёшься. Сам от такой архитектуры порой охуевал.