设计具有多对多和跨实体关系的Cloud Firestore架构

时间:2017-10-04 19:35:03

标签: firebase google-cloud-firestore

关于设计Firestore架构的一个简单问题:

我知道你必须使用正确的工具来完成工作,而Firestore不应该是一个关系数据库,但有没有建议的技术来建模多对多关系?

例如:

我想构建一个属性管理应用程序

公司拥有属性,其中包含单位。层次结构在这里很简单。

因此,租户将随着时间的推移租用多个单位,每个单位将随着时间的推移拥有许多租户......所有这些都由租约封装,将1个单位与1个或更多租户联系起来。

单位可以拥有租约我猜,但是租户如何随着时间的推移看到他们的所有租约..租约是否有一个引用租户的子集合..是租户顶级?

只是寻找一些基本建议..

或者只是将GraphQL与关系数据库一起使用会更好吗?

1 个答案:

答案 0 :(得分:10)

更新:截至2019年5月,Cloud Firestore现在支持collection group queries

单位可以包含租约子集合,您可以使用集合组查询返回包含特定用户的所有单位的所有租约。

原始回答

不幸的是,这里没有免费的午餐。

单位可以拥有租约,但目前可以阻止交叉单位查询,例如租户租用的单位。我们还不支持collection group queries,但是当我们这样做时,这是可行的。

要解决此问题,请将租约设为unittenant字段之间的1对1映射的顶级集合,然后您的租约历史记录为db.collection('leases').where('tenant', '==', 'cdock')。您可以在租约中存储有关单位的足够信息,以避免从租赁到单位加入,以及有关租户的足够信息以避免加入。

如果每个租约的租户数量很少,您还可以租赁1个单元到多个租户,租户设置如下:

'tenants': {
  'cdock': true,
  'alice': true,
  'bob': true
}

然后,您可以使用db.collection('leases').where('tenants.cdock', '==', true)查询您的历史记录。

租户可以是顶级(和加入)或不是,取决于您需要保留多少信息以及租约是否需要有关租户的最新信息。