Javascript 如何为我的案例创建最佳firestore模式?

Javascript 如何为我的案例创建最佳firestore模式?,javascript,typescript,firebase,nosql,google-cloud-firestore,Javascript,Typescript,Firebase,Nosql,Google Cloud Firestore,我想为我正在尝试制作的一个小angular应用程序制作一个firestore模式。 我的问题是,我不知道什么模式最有意义。我试图获得良好的性能,并尽可能减少查询。我的目标如下: 卡片 名片 使用者 背景 其思想是,用户有自己的设置(如语言等)。他还可以创建一个卡片列表,他可以在其中添加任意数量的卡片。 我想能够查询所有卡的卡名单,所有的卡名单由用户,所有的设置由用户 有什么建议吗?您的应用程序的数据库模式可能是: Firestore-root | --- users (colle

我想为我正在尝试制作的一个小angular应用程序制作一个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(/* ... */);
    
    db.collection("cards").get().then(/* ... */);
    
  • 使用以下引用获取与特定用户对应的所有设置,并在
    设置
    映射上迭代:

    db.collection("users").doc(uid).get().then(/* ... */);
    
  • 通过在
    cards
    collection reference上附加一个侦听器,从所有用户处获取所有卡片:

    db.collection("users").get().then(/* ... */);
    
    db.collection("cards").get().then(/* ... */);
    
  • 通过使用
    查询
    ,获取与特定用户对应的所有卡片:

    db.collection("cards").where("uid", "==", uid).get().then(/* ... */);
    
尽可能只需要两个顶级集合。对于您的特定用例,也不需要对数据进行非规范化,它将毫无问题地进行扩展

编辑:

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

db.collection("decks").doc(uid).collection("userDecks").get().then(/* ... */);
db.collection("decks").doc(uid)
    .collection("userDecks").doc(deckId)
    .collection("userDeckCards")
    .get().then(/* ... */);
如果要获取与特定用户组对应的所有卡,则需要以下集合引用集合引用:

db.collection("decks").doc(uid).collection("userDecks").get().then(/* ... */);
db.collection("decks").doc(uid)
    .collection("userDecks").doc(deckId)
    .collection("userDeckCards")
    .get().then(/* ... */);
在这种情况下,您需要使用
非规范化
。这是Firebase的常见做法。如果您是NoQSL数据库的新手,为了更好地理解,我建议您观看此视频。它适用于Firebase实时数据库,但同样的规则适用于云Firestore


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

嗨,alex,谢谢你再次回复:)我还需要每个用户有多个卡片列表。此cardlist应该类似于带有名称和其他属性的carddeck。您是否会制作一个集合
卡片组
,而在这个集合组中制作一个带有
卡片的集合
?或者你将如何解决这个问题?不客气:)是的,你是对的,需要一个新的集合,它还包含另一个用户卡集合。请看我的最新答案。谢谢你的编辑。现在一切都清楚多了。现在我还有最后一个问题。在您的结构中,您创建了一个集合
decks
,在这个集合中有uid(代表用户ID?),在另一个集合
userDecks
。是否可以删除集合ùserDecks`并将属性uid(用户id)添加到
deck
中,然后按userId查询所有deck,如下所示:
db.collection(“decks”,q=>q.where(“uid”),q=”,uid)).doc(docId)。collection(“userdecks”).get()。然后(/*…*/)
代表用户ID?
A:是的,没错
是否可以删除集合ùserDecks
并添加属性uid`a:是的。没有。如果您认为使用
“deck”,q=>q.where(“uid”,“uid=”,uid)
进行查询会使您的工作更轻松,那么继续吧。