Firestore: выполнение сложных запросов на обновление с несколькими получениями (ReactJS) - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть сетка данных, конечные точки которых отображаются из данных, хранящихся в моей базе данных пожарного депо.Так, например, план мог бы быть следующим:

|Потрачено всего: $ 150 |

|Элемент 1: $ 80 |

|Элемент 2: $ 70 |

Таким образом, значение всех этих затрат (70,80 и 150) хранится в моей базе данных пожарного депо, а подэлементы являются отдельной коллекцией от моих общих расходов.Теперь я хочу обновить цену товара 2 до 90 долларов, что затем обновит значение товара 2 в пожарном депо, но я хочу, чтобы он затем проверил таблицу, чтобы «потраченная сумма» также была обновлена ​​доскажем "170 долларов".Каков был бы лучший способ сделать что-то подобное?

Особенно, если бы мне нужно было добавить несколько строк и столбцов, которые все зависят друг от друга, каков наилучший способ обновить одну часть моей сетки, чтобы после слов корректно обновлялись все конечные точки данных в сетке?Должен ли я использовать облачные функции как-то?

Кроме того, я создаю приложение ReactJS, и ранее в нем я просто сохранял свои конечные точки сетки в своем хранилище Redux, чтобы я мог запускать сложные методы, которые проверяли каждую строку и столбец и выполняли некоторые математические операции для обновления.каждая конечная точка правильно, но каков наилучший способ сделать это сейчас, когда я перенес свои данные в хранилище данных?

Редактировать: вот несколько фотографий того, как я сейчас пытаюсь настроить макет своего пожарного магазина: enter image description here enter image description here enter image description here

1 Ответ

0 голосов
/ 18 ноября 2018

Возможно, вы захотите немного сделать резервную копию и получить лучшее представление о типе базы данных Firestore. Это NoSQL, поэтому таких вещей, как строки, столбцы и таблицы, не существует.

Попробуйте это видео: https://youtu.be/v_hR4K4auoQ и этот: https://youtu.be/haMOUb3KVSo

Но да, вы можете использовать облачную функцию, чтобы обновить значение для вас, или вы можете сделать новый расчет общего расхода в логике вашего приложения, и когда вы пишете новое значение для элемента 2, также пишите новое значение для потраченного Всего.

Но в основном вам нужно понять, как хранилище данных хранится в пожарном хранилище, и как взимается плата за его получение. С вас в основном взимается плата за каждый запрос на чтение / запись, и вы гораздо меньше заботитесь о фактическом объеме данных, которые вы сохранили в целом. Поэтому, вероятно, будет лучше НЕ хранить эти значения в отдельных коллекциях, если вы всегда будете использовать их одновременно.

Например:

Сбор (транзакции) => Документ (транзакция133453) {элемент 1: 80 долларов США, элемент 2: 70 долларов США, потраченный итог: 150 долларов США *

и затем, если вам нужно обновить эту транзакцию, вы просто обновите все значения для этого документа сразу, и это будет считаться только 1 операцией записи. Вы можете сохранить коллекцию транзакций как подколлекцию документа клиента или просто как собственную коллекцию. Но суть в том, что большинство рекомендаций, которые вы бы использовали для базы данных SQL с таблицами, столбцами и строками, на 100% не имеют значения для базы данных Firestore (NoSQL), поэтому вы должны полностью понять, что это значит, прежде чем начать планировать структуру вашей базы данных.

Надеюсь, это поможет !! Happy YouTubing ...

Редактировать в ответ на комментарий:
Мне нравится думать о том, как я собираюсь использовать данные, в отличие от того, что является наиболее логичным способом организации данных. Я не уверен, что понимаю контекст ваших примеров данных, но если бы я отслеживал бюджеты проектов или что-то в этом роде, я мог бы использовать что-то вроде скриншотов, которые я вставил ниже.

Поскольку у меня, вероятно, будет довольно ограниченное количество членов команды для каждого бюджета, которые можно будет сохранить в массиве в документе вместе со ВСЕМИ полями, относящимися к этому бюджету, - в основном все, что мне может понравиться например, показать на экране, который отображает детали бюджета. Потому что, когда вы делаете запрос, чтобы заполнить данные для этого экрана, если все, что вам нужно, все в одном документе, то вам нужно сделать только один запрос! Но если вы сохранили свои «заголовки» в одном документе, а затем «данные» в другом документе, теперь вам нужно сделать 2 запроса, чтобы заполнить 1 экран.

Тогда, возможно, на этом экране у меня есть ссылка на «Просмотр связанных транзакций», если пользователь нажимает на эту ссылку, вы вызываете запрос к вашей коллекции транзакций. Что-то вроде транзакций лучше всего хранить в коллекции, потому что вы, вероятно, не знаете, будет ли у вас 5 транзакций или 500. Если вы хотите показать, сколько всего транзакций было на вашей странице с подробной информацией о бюджете, вы можете добавить поле в вашем бюджете документа для "totalTransactions: (число)". Затем каждый раз, когда пользователь добавляет транзакцию, вы записываете подробности транзакции в соответствующую коллекцию транзакций, а также увеличиваете поле totalTransactions на 1 - это будет 2 записи в вашу базу данных. Firestore строится вокруг концепции, согласно которой пользователи, скорее всего, читают данные намного чаще, чем записывают данные. Поэтому делайте две записи, когда вы обновляете свои транзакции, но вам нужно только читать один документ каждый раз, когда вы просматриваете свой бюджет и хотите знать, сколько транзакций имело место.

То же самое для чатов. Но вы можете сделать чаты только вложенной коллекцией бюджетного документа, если хотите, чтобы чаты отображались только для одного бюджета за один раз. Если вы хотите, чтобы все ваши чаты размещались на одном экране, чтобы говорить обо всех бюджетах, вы, вероятно, захотите сделать свою коллекцию чатов на корневом уровне.

Что касается получения данных из документа, то это в основном объект JSON, поэтому (может незначительно отличаться в зависимости от того, в каком приложении вы работаете),
вложенный массив называется:

documentName.arrayName[index]
budget12345.teamMembers[1]  

вложенный объект:

documentName.objectName.fieldName
budget12345.projectManager.firstName

И тогда подколлекция будет

collection(budgets).document(budget12345).subcollection(transactions)

FirebaseПример бюджетного документа

FirebaseExample остаток бюджета документа

FirebaseExample коллекция командных чатов

Коллекция транзакций FirebaseExample

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...