【发布时间】:2019-06-19 17:03:51
【问题描述】:
我在 Firestore 上苦苦挣扎。问题是如何构建数据,而不会陷入计费陷阱/噩梦。
我有以下数据结构:
school
course1
section1
page1
page2
section2
page1
page2
...
我假设一门课程通常不会超过 50 个部分。
使用集合
所以我可以使用一个集合并为每个部分创建一个包含每个部分的名称和描述的文档。
db.collection("schools")
.document("school1")
.collection("courses")
.document("course1")
.collection("sections").snapshots()
文档结构:
name: "Section 1"
description: "Description 1"
但是,如果我需要显示部分列表,那么根据 Firestore 计费,我会为每次阅读文档付费。这意味着如果有 20 个部分,我将收取 20 次阅读的费用。
使用带有嵌套集合的文档
我也可以只创建一个文档“课程 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 获取集合中的文档,这似乎更快。
所以我不知何故无法决定采用哪种方法。不知何故,使用集合会更合乎逻辑,因为我永远不会在任何限制下运行,而且加载似乎更快,但从计费的角度来看,嵌套部分会更有意义。
哪个选项更好?
【问题讨论】:
-
使用 NoSQL 数据建模,更好的选择是适合您的应用程序需求(您尚未完全指定)的选择。您可能会过度考虑成本和性能。大多数情况下,您应该考虑如何组织数据,以便您的应用可以有效地查询数据,并由应用的 UI 驱动。如果您不知道您的 UI 和查询将是什么,那么您将难以构建数据。不要本末倒置。
-
从 UI 的角度来看,课程、部分和页面需要一起加载。所以一份文件会更有意义。我肯定是想多了,但我想从成本的角度来解决这个问题,因为如果我不能为客户提供有竞争力的价格,这可能会毁了整个案子。如果我比竞争对手贵,那案子就死定了。如果我以灵活性为代价并需要移动数据,则可能会在将数据从文档迁移到集合期间导致中断,并且还会花费大量时间和成本。估计我需要详细计算,如果没有技术反之亦然。
标签: flutter google-cloud-firestore