Я знаю, что Firebase не поддерживает JOINs между узлами (например, SQL Server делает между таблицами), но это именно то, что мне нужно выполнить. Вот моя ситуация:Как я могу достичь этого отношения «многие ко многим» в Firebase?
У меня есть узел транзакций в Firebase, как это (где я в том числе название категории по каждой сделке):
"transactions":
{
"-Jruazf35b9a_gAVmZBe":
{
payee: "McDonalds", amount: "2.35", category: "Eating Out"
}
"-JruadR11b4a_aTVmZFi":
{
payee: "Walmart", amount: "78.12", category: "Household"
}
"-Jruazf35b9a_AgvNWCq":
{
payee: "CapitalOne", amount: "150.00", category: "Debt"
}
"-JryJF2c33ijbjbBc24p":
{
payee: "FootLocker", amount: "107.54", category: "Personal Blow"
}
"-Jrz0T-aL61Vuw4SOqRb":
{
payee: "Starbucks", amount: "2.88", category: "Eating Out"
}
}
И у меня есть Категории узла, как это (где я в том числе операции по каждой категории):
"categories":
{
"-Jruazf35b2a_gAVmZRy":
{
categoryname: "Eating Out",
categorytype: "Expense"
}
"transactions": {
"-Jruazf35b9a_AgvNWCq": {
payee: "McDonalds", amount: "2.35"
}
.
.
.
}
}
}
Пока все хорошо. Мои данные плоские. Я могу показать список транзакций с названием категории (снимок экрана ниже), и я могу показать список транзакций по каждой категории в разделе расходов по категориям (скриншот не показан здесь).
У меня есть проблема в том, что если я переименовать категорию изменение отражается только для будущих сделок. Предыдущие транзакции показывают старую категорию.
Это очевидно из-за того, как я сохраняю данные. Поэтому моя первая логическая реакция состояла в том, чтобы сохранить уникальный идентификатор категории в узле транзакций вместо имени категории. Тем не менее, это представляет проблему, когда в моем маленьком мозгу SQL Server мне нужен JOIN, поэтому я могу получить список транзакций, а также указать название категории для каждой транзакции.
Как структурировать мои данные, так что я могу:
- показать список сделок, в том числе названия категории (как это делает сегодня)
- позволяют пользователю переименовать категорию и шоу изменение отражается на ВСЕ сделки (прошлые и будущие)
- показывают перечень операций по каждой категории (я считаю, что нынешний подход будет по-прежнему в силе)
Возможный дубликат? http://stackoverflow.com/questions/25712083/how-to-do-joins-on-firebase-tables Да, я думаю, что лучше всего отделить категорию от своего собственного типа. Транзакции должны быть связаны с идентификатором категории, а не с названием категории. И тогда вам не нужно вести список транзакций в вашей категории. Просто метаданные категории, такие как идентификатор, имя и т. Д. – bbill
@bbill благодарю вас за быстрый ответ, и да, я согласен, что идентификатор категории должен быть связан с транзакциями. Читая сообщение блога «Запросы Часть 1: ...», мне все еще не ясно, как подойти к решению, чтобы иметь возможность достичь чего-то подобного: _ «Выберите tran.payee, tran.amount, cat.categoryname из транзакции tran left join категории cat on cat.categoryid = tran.categoryid "_ –
Объединение данных из двух списков по своей сути является медленной операцией, особенно в базах данных NoSQL. Я бы рекомендовал хранить« categoryName »и ** add **« categoryId ». Таким образом, вы можете показать текущий экран с помощью одного read, но * также * ссылка на категорию. Как справиться с обновлением 'categoryName' в каждой транзакции, см. http://stackoverflow.com/questions/30693785/how-to-write-denormalized-data-in- firebase/30699277 # 30699277 и https://medium.com/@collardeau/es6-promises-with-firebase-76606f36c80c –