Comments 34
Кстати, вложенные сущности использовать наоборот не рекомендуется. Суть в том, что при подписке на какой-либо из ключей при изменении вложенных сущностей передаются вообще все данные этого самого ключа. Например, в отеле изменили данные о номере. Если вы были подписаны на "/отель/", то вам придут данные об этом отеле целиком, со всеми номерами и прочим. Если же внутри отеля хранить данные о бронях, то придут и брони. Короче говоря, трафик увеличивается в разы. Поэтому нужно хранить данные как-то так:
{
"отели": {
"id отеля": {
...
}
},
"номера_отеля": {
"id отеля": {
"id номера": {
...
}
}
}
}
Сумбурно описал, но надеюсь, смысл понятен будет.
Поэтому нужно хранить данные как-то так:
Да дело в том, что это просто неподходящий инструмент для такой задачи. Если ваши данные имеют реляционную структуру, то и голову ломать не нужно, вам требуется реляционная СУБД. А подобные варианты — это забивание гвоздей крестообразной отвёрткой и закручивание шурупов молотком.
Вывод — не надо пихать NoSQL туда, где его использовать не стоит.
Firebase позиционируется как Backend as a Service. NoSQL — это детали реализации, на которые наступаешь только уже попробовав.
Посоветуете аналогичный сервис, только с SQL структорой данных?
+1, не надо так, пожалуйста. Пара таких статей в ленте RSS — и квоте мобильного трафика на день придет конец.
Хипстеры на марше.
Ради задачи, для решения которой (в виде MVP) за глаза хватит SQLite, притащили адовый ворох SaaS решений, потратили кучу времени на взаимное интегрирование всего барахла (без описания, конечно же, что, куда и с какими учетными данными за чем обращается), технично разложили грабли с денормализацией и дублированием данных, да помножили в своей этой Ноде все строки на картинки.
Оглушительный успех, я считаю.
да помножили в своей этой Ноде все строки на картинки
Это 5 с плюсом :)
Firebase — это, какбэ, далеко не только БД. А реализация собственной полноценной архитектуры/инфраструктуры дает не меньший простор для "ломания дров". Все вокруг такие умные, хипстерами обзываются, а сами никогда не лажают, ага.
OrientDB:
- гибридная субд, хранящая грубо говоря JSON-ы с отношениями.
- умеющая в права пользователей вплоть до права конкретному пользователю на чтение конкретной записи.
- Поддежка REST и адаптеры под разные языки.
- Lucene на равне с другими индексами, из коробки работает по любым полям.
- Все данные хранятся в нормализованном виде.
- Шардинг и репликация из коробки.
- Веб админка тоже в коробке.
- Простым запросом можно выбрать всё необходимое на нужный уровень глубины связей.
- Может встраиваться в Java приложение.
Подробнее тут: https://habrahabr.ru/post/267079/
С ArangoDB не приходилось сравнивать? Сейчас между ними выбираю.
http://db-engines.com/en/system/ArangoDB%3BOrientDB%3BNeo4j
http://vschart.com/compare/arangodb/vs/orientdb
Фичи, которые есть в Orient, но нет в Arango:
- Автоматические распределённые запросы. Ориент знает на какой ноде что лежит и сам делает map-reduce.
- Прямые ссылки между документами. Это даёт простые запросы, быстрый переход по связям, удобное администрирование.
- Возможность встраивания в Java приложение с доступом к низкоуровневым API.
- Поддержка пессимистичных и оптимистичных блокировок.
- Триггеры, правда мне в своё время не удалось прикрутить их ко внешнему приложению.
- Fetch plan, позволяющий выбирать не только найденные узлы, но и связанные с ними по заданным правилам.
- Более развитая поддержка графов.
- Продвинутая система прав: пользователи/роли, записи/классы, чтение/запись/обновление/удаление, наследование.
- Шифрованное хранилище.
Преимущества Arango:
- Встроенный NodeJS со всеми вытекающими.
ElasticSearch прекрасно может жить без Firebase как поисковой движок + база данных NoSQL.
Вот пост на Хабре про использование Firebase https://habrahabr.ru/company/iloveip/blog/312232/
И ссылка на сервис http://www.iloveip.ru/banki/
ИМХО, для MVP вполне подходит вариант хранения связей по идентификаторам в сущностях. Проблемы возникают только если формат данных подразумевает большое количество связей и тогда это вопрос правильной категоризации. Firebase — это отличный инструмент, который позволяет реально быстро стартануть и многое дает из коробки (включая хостинг статики), но конечно подходит не на все случаи жизни. Не думаю, что его стоит в этом винить.
Проблема возникла уже в самом начале, т.к. браузерный клиент Firebase не поддерживает полноценную офлайн работу. Лучшим решением что я смог найти оказался как бы порт CouchDB в браузеры — PouchDB и во всех современных (и не очень) браузерах он работает просто великолепно. Из коробки есть встроенная, автоматическая синхронизация с CouchDB (пока не проверял) или DBaaS сервисами типа: https://console.ng.bluemix.net/catalog/services/cloudant-nosql-db
Вот сейчас сижу и думаю: «зачем мне вообще использовать Firebase, если PouchDB — Simple Server — CouchDB / DBaaS CouchDB решают все мои проблемы?»
CouchDB, Couchbase,… позиционируют себя как DBaaS (DataBase as a Service) и как мне известно все же требуют хоть какого-то сервера, на котором и будут определяться права доступа к базе.
Сначала хочу попробовать подружить PouchDB и Firebase. Сейчас не особо хочется заморачиваться с серверами. Но на перспективу все же смотрю в сторону независимой от сторонних сервисов архитектуры.
P.S.: Это был комментарий ко всему посту, просто прилепился не туда…
У firebase есть две базы данных, realtime database и firestore. + Есть полноценный backend ( cloud functions ). Есть подписки, крон задачи и все, что необходимо доя mvp+++.
Firebase: прощание с иллюзиями