Firebase数据库针对多个索引的正确结构

时间:2018-10-16 12:06:30

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

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

这是我想要的桌子

Contracts
    ID
    PlayerID
    CompanyID
    Status
    ExpiryDate
    Etc...

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

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

在另一个功能中,我想获得一个状态为0且CompanyID = custom_companyid的合同(看看公司中是否有未履行的合同)

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

我应该如何处理?我刚刚得知我无法执行几个orderByChild,这对于新手来说使数据库变得更加复杂。

我曾经考虑过制作几个表“ ContractByCompany”,“ ContractByPlayer”,这将有助于完成任务,但我认为修复目前我必须适应的所有表将是一个巨大的痛苦。 / p>

1 个答案:

答案 0 :(得分:1)

如果您是NoSQL数据库的新手,我首先建议您阅读有关NoSQL data modeling的文章。然后,如果您来自关系数据库的背景,那么视频系列Firebase for SQL developers是什么。有了这些材料,您就可以更好地推理数据模型。 :-)

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

也就是说,创建自定义索引也是可以的。实际上,Firebase在其生命的最初几年不支持ref.orderByChild("Status_CompanyID").equalTo("0_custom_companyid"),因此,此类自定义索引是执行此类查询的唯一方法。在这种情况下,除了主要的orderByChild()节点之外,您还将获得三个自定义索引:

Contracts

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

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