首页 > 解决方案 > 如何为我的案例制作最佳的 Firestore 架构?

问题描述

我想为我正在尝试制作的一个小角度应用程序制作一个 Firestore 架构。我的问题是,我不知道哪种模式最有意义。我试图获得良好的性能和尽可能少的查询。我的对象如下:

这个想法是,用户有他自己的设置(如语言等)。他还可以创建一个卡片列表,他可以在其中添加任意数量的卡片。我希望能够按卡片列表查询所有卡片,按用户查询所有卡片列表,按用户查询所有设置...

有什么建议吗?

标签: javascripttypescriptfirebasenosqlgoogle-cloud-firestore

解决方案


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

Firestore-root
   |
   --- users (collection)
   |    |
   |    --- uid (document)
   |         |
   |         --- userName: "NameOfUser"
   |         |
   |         --- settings (map)
   |         |    |
   |         |    --- language: "en"
   |         |    |
   |         |    --- //Other settings properties
   |         |
   |         --- //Other user properties
   |
   --- cards (collection)
   |    |
   |    --- cardId (document)
   |         |
   |         --- uid: "uid"
   |         |
   |         --- //Other card properties
   |
   --- decks (collection)
        |
        --- uid (document)
             |
             --- userDecks (collection)
                    |
                    --- deckId (document)
                          |
                          --- deckName: "NameOfTheDeck"
                          |
                          --- //Other deck properties
                          |
                          --- userDeckCards (collection)
                                 |
                                 --- cardId (document)
                                       |
                                       --- uid: "uid"
                                       |
                                       --- //Other card properties

这个想法是,用户有他自己的设置(如语言等)。他还可以创建一个卡片列表,他可以在其中添加任意数量的卡片。我希望能够按卡片列表查询所有卡片,按用户查询所有卡片列表,按用户查询所有设置

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

  • users通过在集合引用上附加侦听器来获取所有用户:

    db.collection("users").get().then(/* ... */);
    
  • 使用以下参考获取与特定用户对应的所有设置并遍历settings地图:

    db.collection("users").doc(uid).get().then(/* ... */);
    
  • cards通过在集合引用上附加侦听器来获取所有用户的所有卡片:

    db.collection("cards").get().then(/* ... */);
    
  • 使用 a 获取与特定用户对应的所有卡片query

    db.collection("cards").where("uid", "==", uid).get().then(/* ... */);
    

您可以,只需要两个顶级集合。对于您的特定用例,也不需要对数据进行非规范化,它可以毫无问题地扩展。

编辑:

根据您的评论,是的,您应该创建另一个名为的集合decks,以便您可以获得与特定用户对应的所有套牌。为此,需要以下集合参考:

db.collection("decks").doc(uid).collection("userDecks").get().then(/* ... */);

如果要获取与特定用户卡组对应的所有卡片,则需要以下集合引用是集合引用:

db.collection("decks").doc(uid)
    .collection("userDecks").doc(deckId)
    .collection("userDeckCards")
    .get().then(/* ... */);

在这种情况下,您需要使用denormalization. 这是 Firebase 的常见做法。如果您是 NoQSL 数据库的新手,我建议您观看此视频,为了更好地理解Firebase 数据库的非规范化是正常的。它适用于 Firebase 实时数据库,但同样的规则适用于 Cloud Firestore。

此外,当您复制数据时,需要记住一件事。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。


推荐阅读