- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在为 Firestore 苦苦挣扎。问题是如何构建数据,而不会陷入计费陷阱/噩梦。
我有以下数据结构:
school
course1
section1
page1
page2
section2
page1
page2
...
我假设一门类(class)通常不会超过 50 个部分。
使用集合
所以我可以使用一个集合并为每个部分创建一个文档,其中包含每个部分的名称和描述。
db.collection("schools")
.document("school1")
.collection("courses")
.document("course1")
.collection("sections").snapshots()
文档结构:
name: "Section 1"
description: "Description 1"
但是,如果我需要显示部分列表,那么根据 Firestore 计费,我需要为每次阅读文档付费。这意味着如果有 20 个部分,我将按 20 次阅读付费。
使用带有嵌套集合的文档
我也可以只创建一个文档“类(class) 1”并嵌套所有部分。
db.collection("schools")
.document("school1")
.collection("courses")
.document("course1")
.get()
文档结构:
name: "Course 1"
description: "The description",
sections: [
{
name: "Section 1",
description: "Description 1"
pages: [
{name: "Page 1", description: "Page Description 1"},
{name: "Page 2", description: "Page Description 2"}
]
},
{
name: "Section 2",
description: "Description 2"},
pages: [
{name: "Page 1", description: "Page Description 1"},
{name: "Page 2", description: "Page Description 2"}
]
...
]
然后我只会为 1 次阅读付费。我很可能不会遇到 40'000 个属性的限制,也不会遇到 1 MB 的限制。
但是使用 FutureBuilder 从文档中加载数据似乎需要一些时间,如果我使用 StreamBuilder 获取集合中的文档,这似乎更快。
所以我无法决定采用哪种方法。使用集合在某种程度上更合乎逻辑,因为我永远不会在任何限制下运行,而且加载似乎更快,但从计费的角度来看,嵌套这些部分会更有意义。
哪个选项更好?
最佳答案
我同意您的看法,即选择子集合方法而不是传统的多集合方法是困难的。因此,当您决定选择子集合方法时,请牢记以下情况。
何时使用子集合:
1) 当您不想在文档中存储很多字段时。 Cloud Firestore 有 20,000 个字段限制。 (如果学校和类(class)信息可以超过20,000个字段)
2) 当更新父集合是一个常见的操作。 Firestore 只允许您以每秒 1 次写入的速度更新文档。 (如果Schools,Courses,Pages信息经常修改)
3) 当您想限制对文档特定字段的访问时。 (如果您想限制对类(class)页面的访问。在这种情况下,将受限字段移动到另一个集合中的另一个文档也是一个好主意!)
何时不使用子集合:
1)当你想把集合和子集合一起查询的时候。 Firestore 查询很浅。所以查询父集合时不会查询子集合,所以你必须单独查询它们。 (如果你有一个案例在一个窗口中显示所有学校和他们的类(class))
2) 当你想在查看集合时显示子集合时。(显示学校时,你可能想显示它的类(class)。这里阅读次数会增加,因为你不是阅读一份文件,而是阅读一份文件文档及其子集合)
3)当你想同时查询集合和子集合时。(你必须使用集合组查询,因为子集合本质上是集合。)
4) 如果您正在考虑查询单个数据片段,您应该将它们放在一个集合中。 (如果学校的特定属性通常被用户查询或类(class)的详细信息被多个用户查看)
我的建议:
Schools
- Array<CourseIds>
- Other info
Schools
集合,用于存储可以根据质量搜索学校的学校信息。学校信息还可以包含一个字段 courses_available,它可以是一个数组或映射,用于单独存储类(class)名称及其唯一 ID
。
Courses
-Course info
Courses
集合使用相同的方法,因为我假设类(class)信息将根据它们的属性进行大量查询。
CourseSections
-Course1Section1
-Pages
-Course1Section2
-Pages
CourseSections
集合,用于获取有关具有子集合的类(class)部分的信息 页面
。
优点:
CourseSection
可以按需阅读,因此您在阅读 Course
时无需阅读其所有部分。 最终的选择取决于您的用例。
希望这对您有所帮助。
关于flutter - 文档与集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56672713/
我正在尝试从flutter应用程序构建apk,但出现此错误: Note: /mnt/Software/Linux/Flutter/flutter/.pub-cache/hosted/pub.dartl
我有一个名为 X 的较大应用程序,还有另一个名为 Y 的较小应用程序。他们现在彼此分开,并且工作正常。我想将应用程序 Y 集成到 X 中。我想将 Y 的代码放入 X 项目中,但它们应该有不同的 Mai
在android Studio中选择Create New Flutter Project,出现如下4个选项。 Flutter 应用程序 Flutter 插件 Flutter 包 flutter 模块
我看到我的 flutter 项目生成了一个文件 ios/Flutter/Flutter.podspec ,这个文件有什么用? 如果它与生成的 Flutter.framework 有关? 我应该将它包含
我尝试过的 在包含flutter SDK的位置添加/编辑.bash_profile.rtf文件。 导出PATH = / Users / temur / Documents / Projects / F
Flutter 日志会打印数千个详细/垃圾邮件日志。 我正在尝试调试一个复杂的应用程序,但是打印太冗长了,以至于我很难找到我自己打印的东西。 有没有办法禁用详细? 就像是: Logger.level.
在flutter 1.22更新之后,我在Lineargradient colors属性中遇到错误,这给我一个错误,即未定义名称colors参数。.在Android中更新flutter和flutter插
在下面的代码 widget.hintText 中给出错误,我试图将日期选择器作为单独的组件,并在从其他文件调用它时动态传递提示文本值。 import 'package:date_field/date_
在下面的代码 widget.hintText 中给出错误,我试图将日期选择器作为单独的组件,并在从其他文件调用它时动态传递提示文本值。 import 'package:date_field/date_
Flutter 1.0 发布后,我正在按照步骤搭建 Flutter 开发环境。 在步骤中(如所附屏幕截图所示),它说要更新 $PATH 两次,一次使用 flutter 工具的路径 export PAT
我有一个用 flutter 编写的移动应用程序,我想将其转换为 flutter_web 应用程序(集成 flutter_web 尚不可用)。我目前遇到包裹问题。 我已按照本网站中列出的说明进行操作 h
如何向我的 Flutter 路由添加自定义转换?这是我目前的路线结构。 class MyApp extends StatelessWidget { // This widget is the
我正在尝试通过 URL 在 webview 中显示网页。我试过 flutter_webview_plugin 插件,但是当我在浏览器上运行项目时它不起作用。 在 flutter web applica
我正在使用 animatedContainer 在按下按钮时显示 listView.builder()。这是一个要显示的简单子(monad)列表,但问题是我不知道 ListView 构建器的高度会传递
我目前正在我的应用程序中制作渐变背景动画......我正在使用 lottie 动画的帮助下这样做!我试图将它封装在一个容器中并成功地做到了。但是有一个问题,尽管我将高度更改为大于 2000 的东西,但
美好的一天! 我无法弄清楚如何使用 google 标签管理器设置 flutter。我找到了 this package包括标签管理器 api。但是我不知道如何正确配置它。 (在网络上我只需要复制粘贴一个
我的购物车模型如下 class Cart { String description; double unitCost; double amount; int quantity; S
在 Flutter 应用程序中,我想为在线托管的资源(图像、视频等)实现缓存。 我希望它能在原生平台 (Android/iOS)(例如使用文件系统)和网络(例如使用 IndexedDB)上运行。 Fl
我写了一个页面,在顶部一切都很好,应该是这样。在底部我有一个事件的历史。我的容器的宽度是自动确定的(取决于屏幕的宽度),而高度 - 不,在不同的设备上有不同的高度(底部的缩进是不同的)。是否可以自动确
我正在处理一个页面,其中有一些字段,例如 textfield 和 slider。在页面的末尾必须有一个用于进行下一步的按钮,该按钮被包裹在 Align 中以在页面之间具有固定位置。 另一方面,resi
我是一名优秀的程序员,十分优秀!