如何在Firebase中实现这种多对多关系?

时间:2015-06-24 20:57:49

标签: firebase firebase-realtime-database

我知道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. 显示每个类别下的交易清单(我认为当前的方法仍然有效)

1 个答案:

答案 0 :(得分:1)

从两个列表中加入数据本身就是一个缓慢的操作,尤其是在NoSQL数据库上。

我建议保留categoryName并添加categoryId。这样,您可以通过单次读取显示当前屏幕,还可以链接到该类别。有关如何处理每个交易中的categoryName更新,请参阅How to write denormalized data in Firebasehttps://medium.com/@collardeau/es6-promises-with-firebase-76606f36c80c

或者:类别列表可能相对较小。因此,您还可以预先加载它并在迭代事务时执行客户端查找。