私信  •  关注

Alex Mamo

Alex Mamo 最近创建的主题
Alex Mamo 最近回复了
5 年前
回复了 Alex Mamo 创建的主题 » 为NoSQL和Flutter复制SQL联接的FireStore

不幸的是,没有 JOIN 云FireStore或其他NoSQL数据库中的子句。在FireStore中,查询很浅。这意味着它们只从运行查询的集合中获取项。无法在单个查询中从两个顶级集合中获取文档。FireStore不支持一次性跨不同集合的查询。单个查询只能使用单个集合中文档的属性。

所以我能想到的最简单的解决方案是查询数据库以获取 uid 来自的用户 profile 收集。一旦您有了这个ID,就进行另一个数据库调用(在回调中),并从 connection 使用以下查询的集合:

stream: Firestore.instance.collection('connection').where('uid', isEqualTo: "xyc4567").snapshots(),

另一个解决方案是创建名为 连接 在每个用户下添加所有 连接 它下面的对象。这种做法被称为 denormalization 当涉及到火场时,这是一种常见的做法。如果你对noqsl数据库不熟悉,我建议你看这段视频, Denormalization is normal with the Firebase Database 为了更好的理解。它适用于FireBase实时数据库,但同样的规则也适用于云FireStore。

另外,当你复制数据时,有一件事需要记住。以同样的方式添加数据,您需要对其进行维护。换句话说,如果您想要更新/禁止一个项目,您需要在它存在的每一个地方进行更新/禁止。

5 年前
回复了 Alex Mamo 创建的主题 » 如何在NoSQL中建模经典用户->多个关系应用数据

应用程序用例的可能数据库架构可能是:

Firestore-root
   |
   --- users (collection)
   |    |
   |    --- userId (document)
   |         |
   |         --- userName: "John"
   |         |
   |         --- emailAddress: "john@gmail.com"
   |         |
   |         --- uid: "uidOfTheUser"
   |         |
   |         --- //other user data
   |
   --- projects (collection)
         |
         --- projectId (document)
               |
               --- projectName: "ProjectName"
               |
               --- projectId: "projectId"
               |
               --- users: ["uidOfTheUser", "uidOfTheUser"]

使用此数据库模式,您可以简单地:

  • 仅使用 CollectionReference :

    FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
    CollectionReference projectsRef = rootRef.collection("projects");
    projectsRef.get().addOnCompleteListener(/* ... */);
    
  • 获取与单个用户相关的所有项目:

    FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
    Query query = rootRef.collection("projects").whereArrayContains("users", uid);
    query.get().addOnCompleteListener(/* ... */);
    

我们如何将其非规范化?

在这种情况下,不需要对数据进行非规范化。然而,这 denormalization 实践是一种常见的实践,当涉及到消防基地。如果你对noqsl数据库不熟悉,我建议你看这段视频, Denormalization is normal with the Firebase Database 为了更好的理解。它适用于FireBase实时数据库,但同样的规则也适用于云FireStore。

另外,当你复制数据时,有一件事需要记住。以同样的方式添加数据,您需要对其进行维护。换句话说,如果您想要更新/禁止一个项目,您需要在它存在的每一个地方进行更新/禁止。

另请参见:

正如@frankvanpuffelen在他的评论中提到的,请参见以下答案: