草庐IT

flutter - 文档与集合

coder 2023-07-23 原文

我正在为 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/

有关flutter - 文档与集合的更多相关文章

  1. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  2. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  3. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

  4. Ruby 等同于 Sphinx 文档生成器? - 2

    Ruby有一些不错的文档生成器,例如Yard、rDoc,甚至Glyph。问题是Sphinx可以做网站、PDF、epub、LaTex等。它在重组文本中完成所有这些事情。在Ruby世界中有替​​代方案吗?也许是程序的组合?如果我也能使用Markdown就更好了。 最佳答案 自1.0版以来,Sphinx有了“域”的概念,它是从Python和/或C以外的语言标记代码实体(如方法调用、对象、函数等)的方法。有一个rubydomain,所以你可以只使用Sphinx本身。您唯一会缺少的(我认为)是Sphinx使用autodoc从源代码自动创建文档

  5. ruby-on-rails - 在 irb 中阅读文档 - 2

    我怀念ipython的一件事是它有一个?为特定功能挖掘文档的运算符。我知道ruby​​有一个类似的命令行工具,但是我在irb中调用它非常不方便。ruby/irb有类似的东西吗? 最佳答案 Pry是IPython的Ruby版本,它支持?命令来查找有关方法的文档,但语法略有不同:pry(main)>?File.dirnameFrom:file.cinRubyCore(CMethod):Numberoflines:6visibility:publicsignature:dirname()Returnsallcomponentsofthef

  6. ruby - 使用 Nokogiri 和 Ruby 从 html 文档获取链接和 href 文本? - 2

    我正在尝试使用nokogirigem提取页面上的所有url及其链接文本,并将链接文本和url存储在散列中。FooBar我想回去{"Foo"=>"#foo","Bar"=>"#bar"} 最佳答案 这是一个单行:Hash[doc.xpath('//a[@href]').map{|link|[link.text.strip,link["href"]]}]#=>{"Foo"=>"#foo","Bar"=>"#bar"}拆分一点可以说更具可读性:h={}doc.xpath('//a[@href]').eachdo|link|h[link.t

  7. ruby - 如何让 Nokogiri 解析并返回 XML 文档? - 2

    这是一些奇怪的例子:#!/usr/bin/rubyrequire'rubygems'require'open-uri'require'nokogiri'print"withoutread:",Nokogiri(open('http://weblog.rubyonrails.org/')).class,"\n"print"withread:",Nokogiri(open('http://weblog.rubyonrails.org/').read).class,"\n"运行此返回:withoutread:Nokogiri::XML::Documentwithread:Nokogiri::

  8. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  9. Ruby YAML 多文档 - 2

    这是我的YAML文件“test.yml”:---alpha:100.0beta:200.0gama:300.0---3...第一个文档是一个散列。第二个文档是一个整数。我正在尝试将它们作为散列和整数加载到Ruby程序中。这是我目前的尝试:require'yaml'variables=YAML.load_file('test.yml')putsvariables.inspect 最佳答案 要访问单个文件中的多个YAML文档,请使用load_stream方法(正如“matt”在对其他答案之一的评论中提到的):YAML.load_stre

  10. ruby - 自动将院子文档框架添加到现有的 Rails 遗留代码中 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭4年前。Improvethisquestion我希望能够将模板化的YARD文档样式注释插入到我现有的Rails遗留应用程序中。目前它的评论很少。我想要具有指定参数的类header和方法header(通过从我假定的方法签名中提取)和返回值的占位符。在PHP代码中,我有一些工具可以检查代码并在适当的位置创建插入到代码中的文档header注释。在带有Ducktyping等的Ruby中,我确信诸如@params等类型之类

随机推荐