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

Designing Cloud Firestore schema with many-to-many and cross entity relationships

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

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

例如:

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

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

所以随着时间的推移,租户将租用多个单元,随着时间的推移,每个单元将有许多租户。所有这些都包含在租约中,租约将 1 个单元绑定到 1 个或多个租户。

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

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

还是只使用关系数据库的 GraphQL 更好?

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

单元可以包含租赁子集合,您可以使用集合组查询 return 包含特定用户的所有单元的所有租赁。

原回答

天下没有免费的午餐。

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

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

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

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

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

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