2017-10-04 71 views
7

只是设计一个公司的FireStore架构一个简单的问题:设计云架构的FireStore与许多一对多和跨实体关系

我知道你得使用了合适的工具,而公司的FireStore是不应该是一个关系数据库,但有没有建议的技术来模拟多对多关系?

例:

我想建立一个物业管理的应用程序,其中

公司自己的属性,包含单位。层次结构在这里很简单。

因此,租户将随着时间的推移租用多个单元,并且每个单元将有许多租户随着时间的推移。所有这些都由与1个或更多租户相关的租赁组成。

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

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

或者是更好的只是用户GraphQL关系数据库?

回答

9

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

单位可以拥有租约,但目前可以防止跨单位查询,例如租户租用哪些单位。我们还不支持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)你的历史。

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

+0

所以在这里,你的文档中基本上有一个对象'tenants',你正在查询'tenants.cdock'。这是否意味着Firestore能够对这些嵌套属性建立索引? –

+0

我试图做类似的事情,但在查询Firestore时告诉我它需要首先创建一个索引,并且想要索引每个可能的键,如'tenants.cdock','tenants.alice'等。我的键是像租户的名字,所以在查询之前我不能让他们索引。你如何解决这个问题? –

+0

@ThijsKoerselman这里有关于这个文档的信息,以防你还没有找到它:https://firebase.google。COM /文档/公司的FireStore /解决方案/阵列#solution_a_map_of_values 您在数据结构进行编码的详细信息,如时间戳值的关键: '“房客”:{ “cdock”:1502144665, “爱丽丝':1502144665, 'bob':1502144665 }' 它至少可以让你对这些属性有一定的范围查询能力。 – cdock