2015-06-24 124 views
0

我知道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" 
       } 
       . 
       . 
       . 
     } 
    } 
} 

到目前爲止這麼好。我的數據是平坦的。我可以顯示具有類別名稱的交易列表(下面的屏幕截圖),我可以在每個類別的費用(截圖在此未顯示)中顯示每個類別下的交易列表。

enter image description here

我的問題是,如果我重新命名類別的變化不僅僅體現在日後的交易。過去的交易顯示舊的類別名稱。

這很明顯是由於我保存數據的方式。所以我的第一個邏輯反應是將類別唯一ID保存在事務節點中而不是類別名稱中。然而,這提出了一個挑戰,在我的SQL Server小腦袋裏,我需要一個JOIN,這樣我就可以得到事務列表,並且還包括每個事務的類別名稱。

我怎樣組織我的數據,這樣我可以:

  1. 顯示交易的列表,包括該類別的名稱(如它今天)
  2. 允許用戶重命名類別和演出變化反映了所有交易(過去和未來)
  3. 顯示每個類別下的交易清單(我覺得目前的辦法仍然是有效的)
+0

可能重複? http://stackoverflow.com/questions/25712083/how-to-do-joins-on-firebase-tables是的,我認爲你最好的選擇是將類別分成它自己的類型。交易應與類別ID關聯,而不是類別名稱。然後,您不必保留類別中的交易清單。只是類別元數據,如ID,姓名等 – bbill

+1

@bbill感謝您的快速回復,並且我同意類別ID應與交易相關聯。閱讀「Queries Part 1:...」博客文章,我仍不清楚如何通過解決方案來實現類似以下功能:_「Select tran.payee,tran.amount,cat.categoryname from交易tran 左加入類別cat.categoryid = tran。categoryid「_ –

+0

從兩個列表中加入數據本質上是一個緩慢的操作,特別是在NoSQL數據庫上。我建議保留'categoryName'和**添加一個'categoryId'。這樣你就可以顯示當前的屏幕閱讀,但也*鏈接到類別。如何處理更新每個事務中的'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

從兩個列表加入數據I它本質上是一個緩慢的操作,特別是在NoSQL數據庫上。

我建議保留categoryName並添加一個categoryId。這樣,您可以通過一次讀取來顯示當前屏幕,但也可以鏈接到該類別。有關如何處理更新每個事務中的categoryName的信息,請參見How to write denormalized data in Firebasehttps://medium.com/@collardeau/es6-promises-with-firebase-76606f36c80c

或者:類別列表可能相對較小。因此,您也可以在迭代事務時預加載它並執行客戶端查找。

相關問題