Pull to refresh

Comments 34

Я недавно начал работать с Firebase (пробую писать кой-чего под Android). Мне в нем нравится то, что для моего приложения не нужно писать вообще ни байта серверного кода (за исключением правил для базы данных). Но огорчает ужаснейшая документация и отсутствие возможности сделать выборку элементов из базы по идентификаторам.
Кстати, вложенные сущности использовать наоборот не рекомендуется. Суть в том, что при подписке на какой-либо из ключей при изменении вложенных сущностей передаются вообще все данные этого самого ключа. Например, в отеле изменили данные о номере. Если вы были подписаны на "/отель/", то вам придут данные об этом отеле целиком, со всеми номерами и прочим. Если же внутри отеля хранить данные о бронях, то придут и брони. Короче говоря, трафик увеличивается в разы. Поэтому нужно хранить данные как-то так:
{
  "отели": {
    "id отеля": {
      ...
    }
  },
  "номера_отеля": {
    "id отеля": {
      "id номера": {
        ...
      }
    }
  }
}

Сумбурно описал, но надеюсь, смысл понятен будет.
Эмуляция реляционной БД?
Ага. Вот из доков кусок: https://firebase.google.com/docs/database/web/structure-data#flatten_data_structures
И подобный стиль работы используется и в официальных примерах.
Поэтому нужно хранить данные как-то так:

Да дело в том, что это просто неподходящий инструмент для такой задачи. Если ваши данные имеют реляционную структуру, то и голову ломать не нужно, вам требуется реляционная СУБД. А подобные варианты — это забивание гвоздей крестообразной отвёрткой и закручивание шурупов молотком.
Придумать себе проблему, а потом ее героически преодолевать.

Вывод — не надо пихать NoSQL туда, где его использовать не стоит.
Вывод верный, без костылей на Firebase далеко не уехать. Однако есть и свои плюсы. Авторизация и роли, real-time, SDK под разные платформы и многие другие полезные фичи. Для MVP годится.
Просто изначально Ваша задача подразумевала реляционность. Использовать для нее нереляционную БД — это напрашиваться на усложнение архитектуры. В частности, неизбежное потом прикручивание поисковика — эластика/солр/люцены/etc, просто потому, что понадобилось добавить фичу чуть-чуть усложненного поиска — и тут noSQL ожидаемо ломается.

Firebase позиционируется как Backend as a Service. NoSQL — это детали реализации, на которые наступаешь только уже попробовав.


Посоветуете аналогичный сервис, только с SQL структорой данных?

В Backendless есть relations:

https://backendless.com/documentation/data/js/data_relations.htm

Плюс там есть поддержка внешних бд (поддерживаются пока только MySQL/MariaDB).
Имейте совесть, не ставьте в следующий раз на КДПВ 10 мегабайтную гифку.

+1, не надо так, пожалуйста. Пара таких статей в ленте RSS — и квоте мобильного трафика на день придет конец.

В настройках мобильного приложения можно включить загрузку картинок только через WiFi
А можно и не включать. На десктопах 10-мегабайтные гифки тоже не вызывают фонтанов радости. На слабых компьютерах рендеринг повесит систему наглухо.

Хипстеры на марше.


Ради задачи, для решения которой (в виде MVP) за глаза хватит SQLite, притащили адовый ворох SaaS решений, потратили кучу времени на взаимное интегрирование всего барахла (без описания, конечно же, что, куда и с какими учетными данными за чем обращается), технично разложили грабли с денормализацией и дублированием данных, да помножили в своей этой Ноде все строки на картинки.


Оглушительный успех, я считаю.

да помножили в своей этой Ноде все строки на картинки

Это 5 с плюсом :)
UFO just landed and posted this here

Почему? SQLite поддерживает транзакции.

Firebase — это, какбэ, далеко не только БД. А реализация собственной полноценной архитектуры/инфраструктуры дает не меньший простор для "ломания дров". Все вокруг такие умные, хипстерами обзываются, а сами никогда не лажают, ага.

UFO just landed and posted this here
Это статья как не надо становиться жертвой хайпа? гм…

OrientDB:


  1. гибридная субд, хранящая грубо говоря JSON-ы с отношениями.
  2. умеющая в права пользователей вплоть до права конкретному пользователю на чтение конкретной записи.
  3. Поддежка REST и адаптеры под разные языки.
  4. Lucene на равне с другими индексами, из коробки работает по любым полям.
  5. Все данные хранятся в нормализованном виде.
  6. Шардинг и репликация из коробки.
  7. Веб админка тоже в коробке.
  8. Простым запросом можно выбрать всё необходимое на нужный уровень глубины связей.
  9. Может встраиваться в 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:


  1. Автоматические распределённые запросы. Ориент знает на какой ноде что лежит и сам делает map-reduce.
  2. Прямые ссылки между документами. Это даёт простые запросы, быстрый переход по связям, удобное администрирование.
  3. Возможность встраивания в Java приложение с доступом к низкоуровневым API.
  4. Поддержка пессимистичных и оптимистичных блокировок.
  5. Триггеры, правда мне в своё время не удалось прикрутить их ко внешнему приложению.
  6. Fetch plan, позволяющий выбирать не только найденные узлы, но и связанные с ними по заданным правилам.
  7. Более развитая поддержка графов.
  8. Продвинутая система прав: пользователи/роли, записи/классы, чтение/запись/обновление/удаление, наследование.
  9. Шифрованное хранилище.

Преимущества Arango:


  1. Встроенный NodeJS со всеми вытекающими.

ElasticSearch прекрасно может жить без Firebase как поисковой движок + база данных NoSQL.

Мы на нашем сайте тоже используем Firebase для сервиса Банки http://www.iloveip.ru/banki/ и Algolia для поиска. Firebase работает в связке с таблицей Google, я писала об этом подробно на Хабре (https://m.habrahabr.ru/company/iloveip/blog/312232/). Для MVP Firebase действительно подходит, но в будущем мы будем от него отказываться. А вот к Algolia нет никаких вопросов, для поиска на статичном сайте этот сервис вполне устраивает.

ИМХО, для MVP вполне подходит вариант хранения связей по идентификаторам в сущностях. Проблемы возникают только если формат данных подразумевает большое количество связей и тогда это вопрос правильной категоризации. Firebase — это отличный инструмент, который позволяет реально быстро стартануть и многое дает из коробки (включая хостинг статики), но конечно подходит не на все случаи жизни. Не думаю, что его стоит в этом винить.

Последние несколько месяцев разрабатываю «Offline First Progressive Web App» (для работы с очень плохим или вообще без Интернета). С самого начала планировал использовать Firebase для быстрого старта.

Проблема возникла уже в самом начале, т.к. браузерный клиент Firebase не поддерживает полноценную офлайн работу. Лучшим решением что я смог найти оказался как бы порт CouchDB в браузеры — PouchDB и во всех современных (и не очень) браузерах он работает просто великолепно. Из коробки есть встроенная, автоматическая синхронизация с CouchDB (пока не проверял) или DBaaS сервисами типа: https://console.ng.bluemix.net/catalog/services/cloudant-nosql-db

Вот сейчас сижу и думаю: «зачем мне вообще использовать Firebase, если PouchDB — Simple Server — CouchDB / DBaaS CouchDB решают все мои проблемы?»
И как там у couch-семейства с граблями? Мне в ближайшее время как раз предстоит работать над чем-то подобным, только со стороны backend'а. Хочется из коробки работы с Android/iOS и вменяемой поддержки клиентского js. Пока смотрю в сторону couchbase sync gateway. Но по ощущениям везде проблемы с реализацией контроля доступа, а мне как раз нужны фишки типа расшаривания документа одного пользователя другому. В этой штуке хоть channels есть.
Firebase позиционирует себя как BaaS (Backend as a Service), т.к. он предоставляет хоть какую-то настройку прав доступа + регистрацию/авторизацию/аутентификацию. Если клиент — это простой CRUD или что-то типа того, то мне кажется этого должно хватить.

CouchDB, Couchbase,… позиционируют себя как DBaaS (DataBase as a Service) и как мне известно все же требуют хоть какого-то сервера, на котором и будут определяться права доступа к базе.

Сначала хочу попробовать подружить PouchDB и Firebase. Сейчас не особо хочется заморачиваться с серверами. Но на перспективу все же смотрю в сторону независимой от сторонних сервисов архитектуры.
Спасибо за ответ. Мне-то как раз сервер развернуть не проблема и вопрос скорее в том, какая технология что умеет. Пока couchbase sync gateway выглядит неплохим компромиссом. Но надо покопаться в нём глубже. Похоже что синхронизировать-то он синхронизирует (из коробки шлёт данные с мобильных устройств при изменении данных в Couchbase Light и обратно при изменениях на сервере), но при этом все данные довольно тупо прогоняются через sync метод и туда нужно зашить всю логику проверки данных и все сторонние операции, которые напрямую с обменом данными не связаны (логи писать, статистику собирать и т.п). В результате получается bottleneck и страшно как бы вся эта конструкция не развалилась под нагрузкой. Ну и отсутствие транзакций не добавляет радости (кстати, в Firebase они вроде бы есть, но я так до конца и не понял, как они устроены; похоже чуть ли не на лок все устройства, работающие с данными), хотя вроде бы есть какой-то механизм разрешения конфликтов. Но после долгого копания других достойных альтернатив я не нашёл.
Про грабли Firebase неплохо написано здесь: Reasons Not To Use Firebase Хотя часть по-моему относится вообще к backendless-архитектуре. По началу она правда кажется прорывом, но в конечном итоге оказывается, что теперь всю логику надо реализовать на клиенте (т.е. минимум для iOS и Android, а может ещё и на продвинутом js-фреймворке под браузеры) и огребать все радости версионирования API, авторизации пользователя и прочего не в одном а сразу в двух-трёх местах. Так что пока backend рано выкидывать на свалку, на мой взгляд. Можно просто перераспределить часть логики с него на клиента, но разумно перераспределить.

P.S.: Это был комментарий ко всему посту, просто прилепился не туда…

У firebase есть две базы данных, realtime database и firestore. + Есть полноценный backend ( cloud functions ). Есть подписки, крон задачи и все, что необходимо доя mvp+++.

Sign up to leave a comment.