Javascript 如何为我的案例创建最佳firestore模式?
我想为我正在尝试制作的一个小angular应用程序制作一个firestore模式。 我的问题是,我不知道什么模式最有意义。我试图获得良好的性能,并尽可能减少查询。我的目标如下:Javascript 如何为我的案例创建最佳firestore模式?,javascript,typescript,firebase,nosql,google-cloud-firestore,Javascript,Typescript,Firebase,Nosql,Google Cloud Firestore,我想为我正在尝试制作的一个小angular应用程序制作一个firestore模式。 我的问题是,我不知道什么模式最有意义。我试图获得良好的性能,并尽可能减少查询。我的目标如下: 卡片 名片 使用者 背景 其思想是,用户有自己的设置(如语言等)。他还可以创建一个卡片列表,他可以在其中添加任意数量的卡片。 我想能够查询所有卡的卡名单,所有的卡名单由用户,所有的设置由用户 有什么建议吗?您的应用程序的数据库模式可能是: Firestore-root | --- users (colle
- 卡片
- 名片
- 使用者
- 背景
有什么建议吗?您的应用程序的数据库模式可能是:
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(/* ... */);
- 通过在
collection reference上附加一个侦听器,从所有用户处获取所有卡片:cards
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)
进行查询会使您的工作更轻松,那么继续吧。