Я знаю, что Firebase не поддерживает JOIN между узлами (как SQL Server между таблицами), но это именно то, что мне нужно сделать. Вот моя ситуация:
У меня есть узел транзакций в 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, чтобы я мог получить список транзакций, а также включить имя категории для каждой транзакции.
Как я могу структурировать свои данные, чтобы я мог:
- показать список транзакций, включая название категории (как это делается сегодня)
- разрешить пользователю переименовывать категорию и показывать изменения, отраженные для ВСЕХ транзакций (прошлых и будущих)
- показать список транзакций по каждой категории (я думаю, что текущий подход все еще будет действителен)
categoryName
и добавитьcategoryId
. Таким образом, вы можете показать текущий экран одним чтением, но также связать с категорией. О том, как работать с обновлениемcategoryName
в каждой транзакции, см. «как записать денормализованные данные в firebase»> stackoverflow.com/questions/30693785/ и medium.com/@collardeau/es6-promises-with-firebase-76606f36c80c - person Frank van Puffelen   schedule 25.06.2015