javascript - 如何为我的案例制作最佳的 Firestore 架构?
问题描述
我想为我正在尝试制作的一个小角度应用程序制作一个 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。
此外,当您复制数据时,需要记住一件事。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。
推荐阅读
- vue.js - VUE i18n 无法翻译错误信息
- java - 当我按下从数据库中检索数据的更新按钮时,如何立即更改 TextView 的值?
- database - 查询以禁用 Postgres 中特定用户的触发器
- c++ - 返回引用返回函数的局部引用与局部变量
- flutter - 颤振图像选择器maxDuration问题
- ios - 如何从 Google Drive (Swift 5) 播放音频文件
- spring-boot - 使用 Springboot 的 API 网关
- angular - 获得响应后在传单上渲染大量动态标记需要大量时间
- c# - EF Core 获取两个属性与列表中的一对属性匹配的记录
- html - React:如何在组件内对齐组件?