gpt4 book ai didi

flutter - 文档与集合

转载 作者:IT王子 更新时间:2023-10-29 07:18:07 25 4
gpt4 key购买 nike

我正在为 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)部分的信息 页面

优点:

  1. 这将帮助您向每个部分添加大量页面。
  2. CourseSection 可以按需阅读,因此您在阅读 Course 时无需阅读其所有部分。

最终的选择取决于您的用例。

希望这对您有所帮助。

关于flutter - 文档与集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56672713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com