2015-06-24 1 views
0

Я знаю, что 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" 
       } 
       . 
       . 
       . 
     } 
    } 
} 

Пока все хорошо. Мои данные плоские. Я могу показать список транзакций с названием категории (снимок экрана ниже), и я могу показать список транзакций по каждой категории в разделе расходов по категориям (скриншот не показан здесь).

enter image description here

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

Это очевидно из-за того, как я сохраняю данные. Поэтому моя первая логическая реакция состояла в том, чтобы сохранить уникальный идентификатор категории в узле транзакций вместо имени категории. Тем не менее, это представляет проблему, когда в моем маленьком мозгу SQL Server мне нужен JOIN, поэтому я могу получить список транзакций, а также указать название категории для каждой транзакции.

Как структурировать мои данные, так что я могу:

  1. показать список сделок, в том числе названия категории (как это делает сегодня)
  2. позволяют пользователю переименовать категорию и шоу изменение отражается на ВСЕ сделки (прошлые и будущие)
  3. показывают перечень операций по каждой категории (я считаю, что нынешний подход будет по-прежнему в силе)
+0

Возможный дубликат? http://stackoverflow.com/questions/25712083/how-to-do-joins-on-firebase-tables Да, я думаю, что лучше всего отделить категорию от своего собственного типа. Транзакции должны быть связаны с идентификатором категории, а не с названием категории. И тогда вам не нужно вести список транзакций в вашей категории. Просто метаданные категории, такие как идентификатор, имя и т. Д. – bbill

+1

@bbill благодарю вас за быстрый ответ, и да, я согласен, что идентификатор категории должен быть связан с транзакциями. Читая сообщение блога «Запросы Часть 1: ...», мне все еще не ясно, как подойти к решению, чтобы иметь возможность достичь чего-то подобного: _ «Выберите tran.payee, tran.amount, cat.categoryname из транзакции tran left join категории cat on cat.categoryid = tran.categoryid "_ –

+0

Объединение данных из двух списков по своей сути является медленной операцией, особенно в базах данных 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 –

ответ

1

Объединение данных из двух списков я по сути, медленная работа, особенно в базах данных NoSQL.

Я бы рекомендовал хранить categoryName и добавить categoryId. Таким образом, вы можете показывать текущий экран с помощью одного чтения, но также и ссылку на категорию. Как справиться с обновлением categoryName в каждой транзакции, см. How to write denormalized data in Firebase и https://medium.com/@collardeau/es6-promises-with-firebase-76606f36c80c.

Альтернативно: список категорий, вероятно, будет относительно небольшим. Таким образом, вы также можете предварительно загрузить его и выполнить поиск на стороне клиента, пока выполняете транзакции.

Смежные вопросы