繁体   English   中英

Firestore数据库模型,文档或子集合中的属性

[英]Firestore DB model, Attribute in document or subcollection

在为Firebase / Firestore建模时,我经常碰到这种分裂的道路,也许您可​​以对此有所了解。

如果我有多位管理员,则每个客户(100位)都可以使用他们的名字。 管理员看不到其他管理员客户(将其视为独立的公司来考虑)。 有什么会更好?

1)添加“客户”根集合,并在其下添加一个ID为管理电子邮件的文档,并在该子集合下添加“客户”文件:

Firestore-root
   |
   --- Clients(collection)
         |
         --- Admin ID/Email(Collection)
              |
              ----------Clients Info (documents)

2)或添加带有客户文档的客户根集合,但每个文档中的一个属性是管理员电子邮件:

Firestore-root
   |
   --- Clients(collection)
         |
         --- Clients Info (documents)
             |
              --- AdminId: (email)

我发现第一个更易于查询,最重要的是,如果要在测试/甚至生产期间在控制台中查看数据,则第一个更易于阅读。 但是我发现第二个是较少的级别。

解决这个问题的正确方法是什么? 谢谢

数据库结构没有正确的方法。 适合您数据库的正确解决方案是适合您的需求并使您的工作更轻松的解决方案。 我对数据库架构的看法实际上与您真正想要实现的目标有关。

如果要查询数据库以仅获取与特定管理员对应的客户端,则可以继续使用第一个选项。 如果您希望在某个时候从数据库中获取所有客户端,那么第二个选项将帮助您实现这一目标。 因此,使用这两个选项可能是一个选择。

但是,如果您想使用第二个选项来实现相同的目的,则只有在您使用基于单个属性( uid属性)的查询时,才有可能这样做:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference clientsRef = rootRef.collection("Clients");
Query query = clientsRef.whereEqualTo("uid", uid);

但是,如果您希望实现与第一个选项相同的功能,并使用如下查询:

Query query = clientsRef.whereEqualTo("uid", uid).orderBy("aProperty", Query.Direction.ASCENDING);

您需要知道您无法实现这一目标。 这是不可能的,因为在这种情况下,您需要创建一个索引,并且不能为每个uid手动创建索引。

还有一件事,我建议您使用uid而不是email address作为文档密钥。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM