Py学习  »  NoSql

如何在NoSQL中建模经典用户->多个关系应用数据

Dominic • 5 年前 • 718 次点击  

我注意到google nosql、firestore和dynamodb等巨头提供的nosql解决方案没有join查询(这里我不包括mongodb和rethinkdb)。

不过,我喜欢将这些应用于简单和成本效益方面的想法。

我喜欢JSON风格的文档数据库,不想回到varchar等黑暗的时代。因此,我想知道为Web构建99%的数据库有多可行。

以这个场景为例:

用户可以是许多项目的成员,可以在项目列表页上查看其项目,并向下钻取到一个项目。 详情页。

从关系上来说,这很简单:

user: { ..., projects: [projectId1, ...] }
project: { ..., users: [userId1, ...] }

然后您可以进行一个连接,在项目列表等上显示一些基本的细节。

但是对于非关系NoSQL呢?我们如何将其非规范化?

您是否只需要:

user: { no project IDs },
project: { users: [userId1, ...] }

然后对于项目列表页或项目详细信息页,只需在 每一个 投影并返回用户所属的用户?这就是NoSQL在效率方面的繁荣所在吗?我不在这里处理大型数据集,我希望项目是10万个而不是大型文档。谢谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30506
 
718 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Alex Mamo
Reply   •   1 楼
Alex Mamo    5 年前

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

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在他的评论中提到的,请参见以下答案: