gpt4 book ai didi

firebase - 优化两条大路径的 Firebase 数据结构

转载 作者:行者123 更新时间:2023-12-02 19:32:00 27 4
gpt4 key购买 nike

我认为我已经将非规范化作为在 Firebase 中存储数据时的主要优化方法,如 this one 等问题中提到的那样在这个 blog post但我被一个小细节困住了。

假设我的域中有两件事,即用户和帖子,如 blog article 中所示。我提到过,我可能有 20,000 个用户和 20,000 个帖子。因为我像个好 child 一样对一切进行了非规范化,所以 root/users/postsroot/posts 一样存在。 root/users/posts 有一组值为 true 的 post 键,这样我就可以获得用户的所有 post 键。

users: {
userid: {
name: 'johnny'
posts: {
-Kofijdjdlehh: true,
-Kd9isjwkjfdj: true
}
}
}

posts: {
-Kofijdjdlehh: {
title: 'My hot post',
content: 'this was my content',
postedOn: '3987298737'
},
-Kd9isjwkjfdj: {
title: 'My hot post',
content: 'this was my content',
postedOn: '3987298737'
}
}

现在,我想列出用户发布的所有帖子的标题。我不想为了获得标题而加载全部 20,000 个帖子。我只能想到以下选项:

  1. 使用 root/users/posts< 中设置为 true 的键子集以某种方式查询 root/posts 路径 路径(如果这是可能的,我还没弄清楚如何)

  2. 将标题存储在 root/users/posts 中,以便该路径中的每个条目都有重复的标题,如下所示:

    帖子:{
    -Kofijdjdlehh:正确
    }

    变成了

    帖子:{
    -Kofijdjdlehh:{
    标题:“这是我的内容”
    }
    }

    这看起来很合理,但我还没有看到这样做的例子,所以我担心这是某种反模式。

  3. 另一种我找不到的方法

非常感谢您提供的有关此用例的任何指示或我可能错过的文档。

最佳答案

这两种解决方案都是有效的。 #1 对于读取数据的人来说会需要更多工作,而#2 在保存数据时会需要更多工作。同样对于#2,您必须处理帖子标题的更新,尽管使用新的 multi-path updates 会非常容易。 .

要实现#1,您实际上需要执行两个查询。这是一个非常基本的解决方案,仅处理添加帖子。它监听添加到用户的帖子,然后将监听器连接到每个帖子的标题。

var usersPosts = {};
ref.child('users').child(userId).child('posts').on('child_added', function(idSnap) {
var id = idSnap.key();

ref.child('posts').child(id).child('title').on('value', function(titleSnap) {
usersPosts[id] = titleSnap.val();
});

});

对于第三种解决方案,您可以使用 firebase-util ,它会自动处理上述场景以及更多。此代码本质上与上面的代码执行相同的操作,只不过它具有为您提供一个要处理的引用的好处。

new Firebase.util.NormalizedCollection(
[ref.child('users').child(userId).child("posts"), "posts"],
[ref.child("posts"), "post"]
).select(
{
key: "posts.$value",
alias: "x"
},
{
key: "post.title",
alias: "title"
}
).ref();

请注意,x 值始终为 true。有必要选择它,因为 firebase-util 要求您从每个路径中至少选择一个字段。

关于firebase - 优化两条大路径的 Firebase 数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33087025/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com