【问题标题】:How can I achieve this Many-to-many relationship in Firebase?如何在 Firebase 中实现这种多对多关系?
【发布时间】:2015-06-24 20:57:48
【问题描述】:

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

到目前为止一切顺利。我的数据是平的。我可以显示带有类别名称的交易列表(下面的屏幕截图),我可以在每个类别的费用部分显示每个类别下的交易列表(此处未显示屏幕截图)。

我遇到的问题是,如果我重命名一个类别,更改只会反映在未来的交易中。过去的交易显示旧的类别名称。

由于我保存数据的方式,这很明显。所以我的第一个逻辑反应是在交易节点中保存类别唯一 ID 而不是类别名称。然而,这带来了挑战,在我的 SQL Server 小大脑中,我需要一个 JOIN,这样我才能获取事务列表并包含每个事务的类别名称。

我如何构建我的数据以便我可以:

  1. 显示交易列表,包括类别名称(就像现在一样)
  2. 允许用户重命名类别并显示反映所有交易(过去和未来)的变化
  3. 显示每个类别下的交易列表(我认为当前的方法仍然有效)

【问题讨论】:

  • 可能重复? stackoverflow.com/questions/25712083/… 是的,我认为您最好的选择是将类别分成自己的类型。交易应与类别 ID 相关联,而不是类别名称。然后您不必将交易列表保留在您的类别中。只是类别元数据,如 ID、名称等。
  • @bbill 感谢您的快速响应,是的,我同意类别 ID 应与交易相关联。阅读“查询第 1 部分:...”博客文章,我仍然不清楚如何接近解决方案以实现与此类似的目标:"Select tran.payee, tran.amount, cat.交易中的类别名称 tran left join categories cat on cat.categoryid = tran.categoryid"
  • 连接来自两个列表的数据本质上是一个缓慢的操作,尤其是在 NoSQL 数据库上。我建议保留categoryName添加 categoryId。这样,您可以通过单次阅读来显示当前屏幕,但链接到该类别。每次事务更新categoryName的处理方法见stackoverflow.com/questions/30693785/…medium.com/@collardeau/es6-promises-with-firebase-76606f36c80c
  • 或者:类别列表可能相对较小。因此,您还可以在迭代事务时预加载它并执行客户端查找。
  • @FrankvanPuffelen 在您迭代事务并添加 categoryId 时执行客户端查找非常有意义。我会试一试并尽快发布我的发现

标签: firebase firebase-realtime-database


【解决方案1】:

连接来自两个列表的数据本质上是一个缓慢的操作,尤其是在 NoSQL 数据库上。

我建议保留 categoryName 并添加 categoryId。这样,您可以通过单次阅读来显示当前屏幕,还可以链接到类别。每次事务更新categoryName的处理方法见How to write denormalized data in Firebasehttps://medium.com/@collardeau/es6-promises-with-firebase-76606f36c80c

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

【讨论】:

    猜你喜欢
    • 2019-11-11
    • 2012-04-05
    • 1970-01-01
    • 2018-11-13
    • 2018-04-17
    • 2012-10-11
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多