firebase Firestore子集合与阵列

6ju8rftf  于 2023-06-30  发布在  其他
关注(0)|答案(3)|浏览(127)

首先,我知道Firestore是如何工作的,并且花了很多时间来评估不同的方法来构建一个好的结构。我仍然在考虑以下场景:
这里有一个食谱数据库。用户可以添加食谱。每个用户都可以从用户生成的食谱列表中选择他们知道如何烹饪的食谱。
现在我希望用户与其他人分享他们的食谱列表。这是我不确定如何使用Firestore最好地完成的地方。诀窍是,我想一次显示所有的食谱,而不想给它们分页。
我目前正在评估两种可能性:

子集合

每当用户分享他的列表时,查看该列表的用户将不得不加载整个食谱列表,这可能导致大量的文档读取(我认为实际上约50,在非常罕见的情况下可能是1000)。
优点:

  • 更自然的结构
  • 更易于维护(例如删除配方,检查是否存在特定配方)
  • 更容易添加字段(例如timeOfCreation,comment,personalRating,...)

缺点:

  • 从长远来看可能会导致大量的读取

数组

我可以将每个已知的食谱(id和imageURL)保存在用户文档中(或者作为一个单独的子文档“KnownRecipes”),保存在一个数组中。这个数组可以是

recipesKnown: [{rid: 293ndwa, imageURL: image1.com, timeAdded: 8371201332}, 
               {rid: 9012831, imageURL: image1.com, timeAdded: 8371201871},
               {rid: jd812da, imageURL: image1.com, timeAdded: 8371201118},
               ...
              ]

优点:

  • 我只需要一个文档读取每当有人想看到另一个用户的名单
  • 阅读用户的列表可能更快

缺点:

  • 很难更新特定的食谱(例如有人想更改imageURL:我需要在本地更改列表,并将整个文档作为更新发送到服务器-因为我不能只更改数组中的单个元素)
  • 当用户决定拥有大约1000个配方时(这可能永远不会发生,但它可能会发生),可以达到Firestore限制的1 MiB限制。一个可能的解决方法是创建一个单独的文档,并将这两个数组拆分为这两个文档。

对我来说,子集合的想法似乎是这个问题的更“干净”的解决方案,但也许我错过了一些关于为什么其中一个解决方案上级另一个的论点。
我最常见的查询如下(按重要性降序排列):

  • 用户可以烹饪哪些食谱
  • 将用户可以烹饪的食谱添加到用户列表
  • 谁可以烹饪特定的食谱(有一个食谱->厨师子集合)
  • 更新用户可以烹饪的现有食谱
t1qtbnec

t1qtbnec1#

您的问题的答案取决于您想要实现的可扩展性级别。
如果根据设计,您希望存储的子数据量有限且非常低,则应该使用数组,因为可以减少文档读取的次数,这意味着成本更低。
如果你的子数据应该随着时间的推移“无限”增加,你应该使用子集合。
如果你正在构建一个不应该在任何方向上扩展的数据库(概念验证,非常小的企业等),那么就选择你觉得更舒服的数据库。

9jyewag0

9jyewag02#

我也在研究同样的问题...
其中一个问题是文档中保存的数据是否会超过1MB,这是文档的限制。研究一下在1MB的纯文本中可以容纳多少,这是一个地狱。不过,如果它是令人难以置信的更大,它将崩溃的最后。因此,如果你认为在一个大的大的方式子集合。
如果我们必须使用Firebase元素逻辑,答案将是子集合。
不过,我想主要的一点是数据拉。如果您调用用户,您将直接提取该MB的数据。相反,它不会加载子集合,即使你加载了它,你仍然可以延迟加载。
我想对于你正在做的子集合的设置。

osh3o9ms

osh3o9ms3#

key是一个额外的collection的利弊
key可以帮助避免重复;但这需要考虑什么是重复的定义(可能会改变);
array的无密钥行为可以通过auto-id来模拟。
p.s. @托马斯在问题中列出的优点/缺点很有帮助。

相关问题