Кращі практики розробки баз даних у режимі реального часу Firebase

News Rush використовує Firebase вже 4 місяці, і хоча ми хотіли б покращити речі (можна назвати "ідеальний продукт?"), Це було цінним доповненням до нашого стеку для наших вимог синхронізації мобільних даних.

Попутно ми дізналися кілька уроків про те, як найкраще використовувати платформу для задоволення наших потреб. Firebase - це база даних, орієнтована на документи / NoSQL, і, таким чином, ділиться багатьма характеристиками цих платформ, але також має деякі унікальні риси, які слід вивчити. Ось короткий викид мозку з того, що ми виявили по дорозі.

RTFM!

Документація SDK зазвичай жахлива, тому багато хто з нас схильні шукати високі точки і повертаються до неї пізніше (або ніколи).

Тут справедливо навпаки. Посібники та зразки легко дотримуватися, а Довідкові документи є ретельними та оманливими. Майже щоразу, коли у нашої команди виникало питання чи питання, ми знаходили рішення в чомусь, що ми пропустили в документах. Ми врешті-решт ссіли і прочитали кожне слово прямо, і це було добре витрачено 3 години.

Також є блог, який є скарбницею пошуку рішень проблем у реальному світі. Ось декілька публікацій, які ми знайшли найбільш критичні в News Rush:

  • Групова безпека в базі даних Firebase
  • Запити, частина 1: Загальні запити SQL, перетворені для Firebase
  • Кращі практики: Масиви в Firebase

Висновок: "Без схем" не означає, що це менше!

Поширене помилкове уявлення про те, що орієнтовані на документи бази базуються на попередньому плануванні щодо того, як структурування даних буде менш важливим. Це міф. Якщо що, ми виявили протилежне: вони вимагають більше.

Немає нічого незвичайного в тому, щоб сказати, що гарне планування може допомогти досягти максимальної продуктивності з будь-якого компонента програмного забезпечення. Але в базах даних SQL зазвичай виправити помилки планування можна просто шляхом приєднання більшої кількості таблиць, виконання підзапитів або масового оновлення даних. Оскільки Firebase не має цих понять, знайдіть час, щоб сісти та фактично моделювати свої дані та шаблони доступу достроково. Ви будете раді, що зробили.

І RTFM!

Підтримка заплутана

Існує ряд варіантів підтримки, але спроба використати неправильну в певній ситуації може бути неприємною. Наш досвід:

  • Слабка: самодопомога та мозковий штурм, орієнтовані на громаду, не підходять для інших місць. Не підходить для "щось вниз".
  • Форма підтримки: "Офіційне" місце підтримки. Повідомте "щось внизу" тут. Запити на функції, ймовірно, отримають консерви "ми розглянемо це, але немає обіцянок".
  • Групи Google: активне залучення основної команди зі звичайними застереженнями щодо часу виконання в поштових системах, орієнтованих на групу. Найкраще місце для високо технічних дискусій щодо внутрішніх програм та "дивних" питань.
  • StackOverflow: повільний / непередбачуваний час відгуку, але найкраще місце для резервного довідкового матеріалу. Якщо ви читали запитання і відповіді на StackOverflow, ви знаєте тип запитання, який найкраще також розмістити там.

Відгуки та прості пошуки - це "дешево"

У Firebase "ref" - це як вказівник на дані. Інстинктивно хотіти кешувати чи іншим чином керувати ними, але в поточних бібліотеках клієнтів Firebase ви ніколи цього не повинні робити. Вони справді просто обгортки навколо посилань URL на об'єкти даних, і зворотний виклик подій, до якого вони надають доступ, може мати лише одного слухача за один раз. Якщо вам потрібно посилатись на об’єкт з двох різних місць, візьміть до нього дві відповіді. Це більше не коштує "робити".

Аналогічне правило стосується пошуку даних. Ті, хто надходить із баз даних SQL, звикли намагатися отримати більші об'єкти за якомога менше запитів, щоб усунути час обходу та накладні запити. Коли вирівнюють структури даних, то спокусити скопіювати "підсумкові" дані в декілька місць, щоб за допомогою одного пошуку отримати все необхідне.

У Firebase це майже повністю неправильне рішення. З одного боку, прості пошуки на основі ключів / посилань значно оптимізовані, і Firebase пропонує величезні горизонтальні масштаби для них. Під час нашого тестування продуктивності в News Rush ми також виявили, що Firebase робить набагато краще з більш дрібними об'єктами. Навіть видалення кількох непотрібних полів може забезпечити помітне підвищення продуктивності.

Як і в оптимізованих схемах Redis для таких структур, як хеші та набори, величезна горизонтальна масштабованість Firebase є однією з її ключових особливостей. Це не повинно бути просто приємним. Її слід використовувати як інструмент у розробці додатків.

Уникайте масивів

Документація Firebase вже висвітлює цю тему. Це все правильно. Уникайте їх.

Без дат

Firebase не має типу об'єкта дати та не дозволяє сортувати низхідні. Ми щойно написали допоміжну функцію "оновлення", яка приймає нативні об'єкти з полями дат і перетворює їх у значення мілісекунди з часу епохи, а також додає відповідні варіанти негативних чисел цих значень. Сортування за зростанням за мінусовим значенням часу забезпечує бажаний порядок зменшення.

Один розмір підходить не всім

Тоді здавалося такою гарною ідеєю ...

Використовуйте сильні сторони Firebase. Не намагайтеся змусити його виконувати кожну роботу, яку маєте. Ось деякі речі Firebase не:

  • Пошукова система. У ньому є кілька основних операцій на зразок збігу префіксів, але це все. Використовуйте ELK, Algolia тощо, якщо вам потрібен повноцінний пошук.
  • Стек API. Хмарні функції для Firebase виглядають дуже перспективно, але все ще є в бета-версії. Якщо ваш додаток - це щось більше, ніж список завдань, сплануйте, як ви будете виконувати виконання сервера / надійного коду.
  • Двигун звітності. Ви все ще можете використовувати реляційну базу даних, коли вам потрібно зрізати / нарізати / зафіксувати / фільтрувати / мутувати / з’єднати / тощо зі своїми даними.
  • Самостійне розміщення або повністю придатний для використання в режимі офлайн. Офлайн-функціональність надається через синхронізацію / постійність, але спочатку потрібно залучати хмару Firebase.

Встановити проти оновлення

Існує велика різниця між операціями SET і UPDATE. Це впливає на те, що станеться, якщо ключ ще не існує, особливо клавіші всередині складних об'єктів. Зверніть на це увагу!

FirebaseUI - приголомшливий!

О, я мушу зазначити, що для багатьох платформ існують супутні проекти FirebaseUI. Використовуйте їх. Вони надзвичайно корисні для таких речей, як налаштування перегляду таблиці для відображення списку об’єктів у колекції Firebase.

Ця бібліотека надає класи FUICollectionViewDataSource та FUITableViewDataSource (та їх еквіваленти на Android), які дозволяють розпочати роботу на мобільній платформі лише з декількох рядків коду. Цей запущений початок був дуже приємний, коли ми спочатку оцінювали Firebase. Нам вдалося зібрати доказ концепції за кілька годин із дуже малою кількістю навчання, порівняно з іншими варіантами на столі.

Коли ви готові до більш досконалості та контролю, FirebaseUI все ще корисний, оскільки він також пропонує класи збору даних нижчого рівня FUIArray і FUIIndexArray, які дозволяють керувати такими речами, як заголовки вкладок та інші дивні відображення.

Я щось пропустив? Поділіться своїм!