【问题标题】:Firebase Database proper structure for several indexes多个索引的 Firebase 数据库正确结构
【发布时间】:2019-03-20 23:09:32
【问题描述】:

我对 Firebase 还是比较陌生,考虑到我对 SQL 的了解,离开它是很奇怪的。

这是我想要的桌子

Contracts
    ID
    PlayerID
    CompanyID
    Status
    ExpiryDate
    Etc...

在一个函数中,我想获取 PlayerID = custom_playerid 的所有合约(获取一个玩家的所有合约)

在另一个函数中,我想获取 CompanyID = custom_companyid 的所有合同(以获取一家公司的所有合同)

在另一个函数中,我想获得一份 Status = 0 且 CompanyID = custom_companyid 的合同(查看公司中是否存在“未履行”合同)

在 cron 作业中,我会搜索 CurrentDate > ExpiryDate 和 Status = 0 的所有合同,以将它们从数据库中删除。

我应该如何处理这个问题?我刚刚了解到我无法执行多个 orderByChild,这使得数据库对于新手来说有点复杂。

我曾考虑过制作几个表格“ContractByCompany”、“ContractByPlayer”,这将有助于完成任务,但我认为修复我目前必须适应的所有表格会很痛苦。

【问题讨论】:

    标签: angular firebase firebase-realtime-database nosql angularfire2


    【解决方案1】:

    如果您是 NoSQL 数据库的新手,我首先建议您阅读这篇关于 NoSQL data modeling 的文章。那么如果你有关系数据库背景,视频系列Firebase for SQL developers。有了这些材料,您将能够更好地推理数据模型。 :-)

    您提到的所有三个用例似乎都可以在没有自定义索引的情况下使用。前两个由对当前数据模型的查询直接支持,而最后一个(对两个值执行 AND)可以通过引入合成的复合属性(例如 "Status_CompanyID": "0_custom_companyid",然后使用 ref.orderByChild("Status_CompanyID").equalTo("0_custom_companyid") 进行查询)来实现。有关此方法的更多信息,请参阅http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase

    也就是说,创建自定义索引也可以。事实上,Firebase 最初几年不支持orderByChild(),因此此类自定义索引是执行此类查询的唯一方法。在这种情况下,除了您的主要 Contracts 节点之外,您最终会得到三个自定义索引:

    ContractByCompanyId
    ContractByPlayerId
    ContractByStatusAndCompanyId
    

    您正在这些节点下复制数据,其中对Contracts 的每个写入操作也会导致索引下的写入操作。这是一个非常类似于关系 DBMS 在幕后自动为您执行的操作。在 NoSQL 中,它只是由您自己的代码在称为扇出的过程中处理。

    最初编写代码以使扇出的数据保持最新确实很棘手。有关这方面最常见的策略,请参阅How to write denormalized data in Firebase

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多