【问题标题】:Efficient way to check for existing related documents in NoSQL (Firestore)?在 NoSQL(Firestore)中检查现有相关文档的有效方法?
【发布时间】:2019-07-03 21:11:55
【问题描述】:

关注当前数据模型

User
  User ID

Video
   VideoID
   LikedBy (Subcol) 
       User ID
       User ID
       User ID

现在,如果用户访问了一个视频,我想显示他是否喜欢该视频(如果您已经喜欢,类似于 youtube 按钮颜色)。

我目前的方法是使用已登录用户 ID 的密钥查询文档,如果找到,则表示用户喜欢该视频。问题是我为艺术家提供了这个,你可以订阅它与 youtube 上的频道太相似了。

仅此一项就创造了大约 3 倍的页面加载初始阅读量。 我想知道是否有任何更有效的方法来查询此类事物或构建数据。

请注意,如果您建议我将所有喜欢的节目存储在用户或节目文档中,由于 1MB 的限制,这是不可扩展的。

【问题讨论】:

    标签: firebase google-cloud-firestore nosql


    【解决方案1】:

    1) 你可以有一个关于用户的子集合,存储喜欢的帖子的ID。

    2) 您可以创建一个users_likes,其中 Ids 是用户 ID 的集合,内部有一个包含用户喜欢的帖子 ID 的数组。

    3) 最后,只需在用户集合上创建名为 likes 的道具并存储帖子的 id。

    所有选项都有一个权衡,我会在加载时对 user 和 posts_likes 进行查询并将其保存在内存中(没有外部用户会影响这一点)。

    Be aware that if you suggest me to store all liked Shows in the User or Show Document that this is not scalable due to the 1MB Limit.

    如果您希望用户喜欢超过 100 万条帖子...否则,仅存储 1Mb 的 ID 是个好主意...我使用相同的模式进行 user events 跟踪,我定义了事件(相当于您的帖子)并且用户做出与这些事件相关的操作(您的喜欢),我有超过 80K 的案例,它就像魅力一样。我给了你 3 个选项,我会说,从 3 开始,直到它不起作用,然后转到 2 和相同的过程直到 1。由于你将使用 id 数组,请使用 this 支持自己

    【讨论】:

    • 是的,第一个解决方案基本上是我当前的解决方案,不同之处在于我将喜欢存储在 Show 的子集合而不是用户上,第二个解决方案基本上也让我进行了额外的阅读,问题在于第三个是如果我想在节目中显示一个总点赞计数器,我可以在添加点赞时在子集合上设置一个触发器,我不能对用户文档做这样的事情,因为它的其他更改可能会经常发生并会触发运行不需要的时间。
    • 如果您可以调用一次并多次使用并保存这些读取,则将其保留给用户的好处
    • 所以基本上你想多读 0 次?我会强调重点放在读/写...我不知道你的项目有多先进,火焰计划提供了很多带宽来玩并保持在免费层
    • 这不是关于额外阅读,而是每个视频点击有 2 次额外阅读(关注和喜欢)经常发生,所以我想问一个解决方法,你的 3. 方法听起来不错但是让我担心一个实现来计算视频的喜欢(通过 gloud 函数增加)
    • 你每天有 200 万次免费调用,从那个开始,如果你需要就改变它,我已经多次实现了这个模式,我的钱包还可以 :)
    【解决方案2】:

    我目前的方法是使用已登录 UserID 的密钥查询文档,如果找到,则表示用户喜欢该视频。

    是的,这是正确的方法。

    仅此一项就创造了大约 3 倍的页面加载初始阅读量。

    我不知道这是从哪里来的,但肯定有问题。不幸的是,您的问题中没有任何内容可以帮助我发现问题。

    我想知道是否有更有效的方法来查询此类内容或构建数据。

    我不太了解您的架构,但我会以这种方式构建数据库:

    Firestore-root
       |
       --- users (collection)
       |    |
       |    --- uid (document)
       |         |
       |         --- //user properties
       |
       --- video (collection)
            |
            --- videoId (document)
                 |
                 --- likedBy: ["uid", "uid", "uid"]
    

    如您所见,likedBy 属性是数组类型。所以一旦你得到一个视频文件,你可以简单地检查登录用户的uidlikedBy 数组。如果存在,则表示用户已经喜欢该视频,否则没有。

    【讨论】:

    • 这是一个好方法,问题是您如何计算视频的总点赞数?通过计算前端的数组长度?
    • 对,没错,获取likedBy数组的大小。
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2020-11-27
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多