Firebase і GraphQL [закрито]


75

Хтось має досвід роботи з GraphQL та Firebase? Я вважаю, що можна було б розмістити виклики firebase у розподільнику відповідного поля, передаючи деяку змінну з реквізиту компонента в аргументи запиту.

Як ми можемо вставити нові дані у Firebase за допомогою GraphQL?



Ви можете спробувати apollo-link-firebase github.com/Canner/apollo-link-firebase , дозволяє запитувати Firebase за допомогою graphQL без серверної служби.
williamC

4
Ми щойно створили інструмент з відкритим кодом, який допоможе вам перейти з Firebase на реальний час GraphQL, фактично перенісши ваші дані до Postgres. github.com/hasura/graphql-engine/tree/master/community/tools/…
iamnat

Повторюю попередній коментар. Хасура - ДИВНА!
leetheguy

Проект з відкритим кодом із використанням Firebase на сервері GraphQL
Робін Вірух 02

Відповіді:


57

Щоб відповісти на ваше запитання, ви можете впоратися з цим трьома способами .

1. Firebase & GraphQL

Якщо ви налаштовані на використання Firebase, ви можете зробити індивідуальне відображення API Firebase у запити та мутації GraphQL.

Ви можете напевно обернути API Firebase у вирішувачі GraphQL і робити дзвінки таким чином. Це хороший приклад того :

const ref = path => firebase.database().ref(path)
const getValue = path => ref(path).once('value')
const mapSnapshotToEntities = snapshot => snapshot.val().map((value, id) => ({ id, ...value }))
const getEntities = path => getValue(path).then(mapSnapshotToEntities)

const resolvers = {
    Author: {
        posts(author) {
            return getEntities('posts').then(posts => filter(posts, { authorId: author.id }))
        },
    },

    Post: {
        author(post) {
            return getEntities('authors').then(posts => filter(authors, { id: authorId }))
        },
    },
};

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

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

2. Беккенд GraphQL як послуга

Враховуючи, що ви готові використовувати такі продукти BaaS, як Firebase, ви можете перейти до використання GraphQL BaaS.

3. Самостійно розміщений GraphQL

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

  • Гнучкість використання власного сховища даних і, можливо, декількох, відповідно до потреб конкретного додатка

  • Спеціальні запити та мутації

  • Власне додайте власну логіку замість мікросервісів, приєднаних до веб-хуків у вашому API

  • Створіть власні механізми автентифікації та дозволу

  • Ймовірно, дешевше рішення


2
Всі хороші речі вище! Чи є приклад, коли хтось мігрував із Firebase для використання Scaphold, який ви можете надати?
Сем Мітчелл

3
Так! Не соромтеся перевіряти Neat App як чудовий додаток, який перенесено з Firebase для використання Scaphold. Будь ласка, не соромтеся звернутися до Scaphold's Slack, щоб попросити інших, хто це зробив.
Вінс,

1
Повинен бути позначений як відповідь!
парохія

@vince я десь читав, що scaphold.io більше не займається бізнесом, чи правильно? (Я усвідомлюю, що веб-сайт все ще працює)
k00k

1
Тепер також AWS AppSync
В’ячеслав А.

17

Я категорично не погоджуюсь з деякими рекомендаціями тут. GraphQL може використовуватися в реляційному відношенні, але він також може використовуватися в режимі NoSQL. Firebase із RTD (база даних у реальному часі) та Firestore слід моделювати як базу даних NoSQL, оскільки це база даних NoSQL! Цей підхід має компроміси:

1. Оптимізоване читання:

Як база даних NoSQL, колекції повинні бути змодельовані як ваші подання у ваших клієнтах (мобільних або веб-мережах), тому, коли ви робите запит, все вже об’єднано, і вам не потрібно робити обчислюваний реквізит у клієнті та функції Firebase. Такий підхід робить читання ДІЙСНО швидким.

2. Деоптимізований запис:

Основна компромісна ситуація полягає в тому, що ви несете відповідальність за оновлення кожного документа в базі даних, якщо торкаєтесь пов’язаних даних (наприклад, оновлення імені користувача, зображення профілю тощо). У цьому випадку ви повинні знайти кожен документ у вашій базі даних (тобто: публікації, коментарі тощо) та забезпечити атомність. Цей підхід рекомендується використовувати, якщо у вас є програма, яка буде мати набагато більше операцій читання, ніж операцій запису (наприклад, блог, 7000 читає на 1 запис як приклад).

3. Легко масштабувати:

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

GraphQL - це лише мова запитів. Це має полегшити вам запит речей, але це не повинно диктувати, як ви моделюєте базу даних. Ви повинні диктувати, як змоделювати базу даних, ваші запити та мутації.


16

TL; DR: GraphQL світить там, де Firebase не відповідає. Потужне моделювання даних, гнучкі та ефективні запити та відкрита специфікація - все це важливі частини GraphQL, яких бракує у Firebase.

Потужне моделювання даних

Firebase отримав багато критики на основі обмеженого моделювання даних. По суті, ваші дані структуровані як єдиний величезний JSON, який кілька разів констатує одні й ті самі дані. Те, що спочатку здається зручним, призводить до некерованого клієнтського коду кожного разу, коли потрібно оновлювати дані, оскільки вам доведеться відстежувати всі посилання на ті самі дані вручну.

Структура даних, що використовується в GraphQL, з іншого боку, дуже інтуїтивна і звична для роздумів, оскільки вона змодельована як графік. Використовуючи синтаксис IDL, ми можемо легко описати нашу модель даних, яка називається схемою GraphQL. Для програми Twitter схема може виглядати так:

type Tweet {
  id: ID!
  title: String!
  author: User! @relation(name: "Tweets")
}

type User {
  id: ID!
  name: String!
  tweets: [Tweet!]! @relation(name: "Tweets")
}

Тут ми визначили два типи Tweetі Userз деякими скалярними властивостями , а також один-до-багатьох між Userі Tweet. Поодинокі елементи даних називаються вузлами - і вузол користувача може бути підключений до багатьох вузлів твіту. Ця структура даних є одночасно простою та гнучкою, крім підходу JSON від Firebase.

Гнучкі та ефективні запити

Можливість гнучких запитів GraphQL - одна з головних його переваг. Запити є ієрархічними, це означає, що ви можете вказати вимоги до даних, що відображають структуру графіка. У нашому прикладі в Twitter ми можемо мати запит, щоб отримати всіх користувачів та їх твіти:

query {
  allUsers {
    id
    name
    tweets {
      title
    }
  }
}

Зверніть увагу, що ми можемо вільно включати або залишати поля, які ми хочемо запитувати, і навіть можемо робити запити в різних відносинах. Це означає, що нам не потрібно робити декілька запитів, і ми не запитуємо непотрібні дані - що робить запити GraphQL надзвичайно ефективними.

Додаючи аргументи запиту до суміші, ми можемо додати такі функції, як спеціальний порядок або фільтри, щоб отримати потужний API GraphQL .

Все це просто неможливо з Firebase.

Дані в режимі реального часу

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

Висновок

Отже, щоб відповісти на ваше запитання: GraphQL перевершує Firebases у більшості аспектів, що робить його кращим вибором.

Якщо вас цікавить GraphQL, я рекомендую вам перевірити Graphcool, який поєднує в собі сильні сторони GraphQL з такими потужними функціями, як вбудована автентифікація та гнучкі гачки для AWS Lambda або інші безсерверні функції для реалізації власної бізнес-логіки.

Застереження: я працюю в Graphcool :)


1
@martktani Я зараз переробляю проект response-redux-thunk-firebase, що складається з `` дописів '' та `` коментарів '', для реагування-redux-graphql. Чи існує процес в Graphcool, який би дозволив створення схеми / вузлів шляхом імпортування даних JSON з Firebase? - запитую я, оскільки думка про необхідність повторного введення всіх існуючих даних по одному вузлу за раз надто болюча для роздумів.
TheoG

1
Вибачте, щойно побачив питання! Ось підручник з імпортування даних JSON у GraphQL. Повідомте мене, якщо це допоможе!
marktani

Привіт Марктані. Я бачу, що деякі частини вашої відповіді були скопійовані звідси , без чіткого пояснення того, що ці частини скопійовані з цього місця (атрибуція + цитування). Я припускаю, що ви написали read.me із цього посилання? Якщо так, можливо, ви могли б зробити це трохи зрозумілішим? (Я шукав скопійовані частини, звідси і коментар). Якщо ні, чи можете ви це пояснити, процитувавши скопійовані частини та давши зрозуміти, звідки копіювали речі.
ТТ.

1
Дякуємо за ваше запитання, @TT. Фактично, текст у посиланні, на яке ви посилаєтесь, скопіював текст з моєї відповіді тут.
marktani

1
О, я бачу зараз :) звідси зворотне посилання. Добре знати.
ТТ.

6

Ви можете використовувати graphql і firebase локально . Весь важкий підйом можна зробити у веб-співробітника, щоб уникнути блокування інтерфейсу користувача під час розв’язання запиту.

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

Для оновлення в режимі реального часу вам потрібно лише підписатися на події реального часу з Firebase і надіслати їх веб-співробітнику, щоб перетворити їх на реальні підписки на Graphql, які можна вирішити за допомогою вашої схеми.

Ви можете знайти більше інформації з цього питання в моєму середньому дописі: веб-додатки реального часу “Лише на стороні клієнта” з Firebase, GraphQL та apollo-client 2.0

Сподіваюся, це допоможе!


5

Чи потрібно використовувати firebase? Є послуги, більш специфічні для GraphQL, які можуть запропонувати те, що ви шукаєте. https://scaphold.io - це компанія зі стипендіями YC, яка виглядає особливо перспективною і надає вам досвід роботи в Firebase, але працює на GraphQL.


2
Чи достатньо того, що scaphold.io слідує спільноті, щоб бути надійним принаймні середньостроково?
Зроблено в Місяці

4
Привіт, це Вінс із Scaphold.io, і я подумав, що я тут курантую . На ваше запитання, так, ми маємо дуже сильну спільноту, і ми нікуди не їдемо. Зараз ми виросли до декількох тисяч додатків на платформі і в даний час в програмі YC Core (W17). Якщо ви хочете приєднатися до розваги, ось наш Slack ( slack.scaphold.io ).
Вінс

2
scaphold є довірливим, мені дуже подобається функція конвеєра, яка допомагає вам легко підключити всі API.
Amazingandyyy

5
аааааа, і його немає. Поза справою. Здається, ваші занепокоєння були дійсними @MadeInMoon
Ніколас Маршалл

@NicolasMarshall добре видно! Щодо відповіді Вінса, це дало мені сумний смак, коли я знав, що навіть "сильна спільнота" може зупинитися, з усіма наслідками для людини та коду
Зроблено в Місяці
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.