【问题标题】:Trouble with Firestore collection designFirestore 集合设计的问题
【发布时间】:2019-12-11 20:22:10
【问题描述】:

我在我的 firestore 数据库中有一个 cmets 部分的设计,我只是在努力处理其中的一部分。我试图在读/写次数方面提高效率以节省成本。

计划是为我们正在评论的项目创建一个包含单个文档的集合。在里面我将有一个文档的子集合(每个文档都是一个包含 50 cmets 的数组的块)。当前块将编号存储在父文档中,与子集合处于同一级别。

+Doc1
     -Block num : 1 
     -Subcollection
                  + 0 : Array of 50 comments  
                  + 1 : Array of 50 comments 
                   etc 

所以我希望每个评论都具有某些属性,例如一个 id、评论文本、用户名和 2 个喜欢/不喜欢它的用户数组。

这样我可以按最近的评论排序(因为我只是向后阅读块。)

我的问题是我想按最喜欢或最不喜欢的 cmets 排序...因为现在每个块都可能有大量喜欢的 cmets。

有没有一种方法来构建这个,无论是通过制作一个新集合还是调整这个集合,这样我就不必阅读每个块来按喜欢的数量排序?

另外,如果有人知道我的设计有任何缺陷,请不要犹豫,提出改进建议。

提前感谢您的帮助:)

---编辑

抱歉各位,我忘了提到我想避免将每条评论都写成文档,因为这在阅读大量内容时会花费很多钱。

【问题讨论】:

    标签: node.js firebase google-cloud-firestore


    【解决方案1】:

    为了能够在所有 cmets 中使用 Firestore 查询,每个评论都必须是一个单独的文档。由于您明确排除了该选项,因此您不能依赖 Firestore 查询来实现用例。

    在这种情况下,下一个选择通常是找到一个允许您的用例的数据模型。例如,如何根据 cmets 的投票数对文档进行分片?因此,投票最多的前 50 个 cmets 位于 document1 中,接下来的 50 个位于 document2 中,依此类推。这样您就可以在单个(或最多几个)文档中获得最受欢迎的 cmets。

    请注意,这将导致编写投票的代码非常复杂,并且可能不得不在文档周围打乱 cmets。这是您必须做出的权衡:额外的复杂性和时间成本是否值得您通过减少读取操作而节省下来?

    【讨论】:

    • 嗨弗兰克,我喜欢你的想法。您认为让云函数处理赞成/反对票是否可行,然后我只需阅读所有评论块/碎片并将它们组合成 1 个大型 js 数组。增加/减少需要更改的注释并使用数组。然后只需根据每 50 cmets 切分阵列并将它们设置为 firebase 上的文档。我还会为最新的 cmets 保留一个单独的集合(有效地复制数据),并会根据他们在 ui 中选择的内容来切换他们从哪个集合中读取。
    • 我们在这里讨论的是代码,所以很可能一切皆有可能。是否可行是主观的。我认为您将花费大量时间和代码复杂性来换取相对较小的节省。但如果你说节省的钱不小而且值得,那你也是对的。
    • 我已经考虑过,我认为这是值得的......感谢您的帮助。
    • 对不起,弗兰克,我还有一个问题。如果您有 Document -> Collection -> Document 并且您阅读了子集合文档,那么这将是多少次阅读?我将使用的参考是 db.collection('parentCollection').doc(parentDoc).collection("sub collection").doc(sub collection doc);... 这将是一个阅读,因为我们刚刚得到子集合文档还是 2(父文档和子集合文档)?
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 2021-08-13
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多