Firebase Firestore评论树架构

时间:2018-04-15 20:57:04

标签: firebase tree schema google-cloud-firestore

我尝试将Reddit / HackerNews风格的评论树作为项目的一部分来实现,并尝试将Firestore作为数据库解决方案。但是,我不确定通过文档正确的设计阅读。在SQL数据库中,我会使用数字键,如:

0
1.0
1.1
1.1.1
0.0

代表我的树。但是,像这样的数字键似乎是Firebase反模式。另一条路线是在json中使用实际树,其中的帖子表示为:

{
  uid: 'A0000',
  content: 'foo',
  children: [
    {uid:..., content:..., children: []}]
}

但据说在Firestore中深树很糟糕。据我所知,深树不好的原因是你必须取出整个东西,但就我而言,我不确定这是不是一个问题。提取帖子的客户端将获取根内容节点和前20个子树。 可能是一个非常大的提取,但不是疯狂的。

有没有人知道实现这种结构的良好标准方法?

额外:这是客户端处理结构时应该看起来更详细的表达式。



{
  uid: 0,
  title: 'Check out this cat!',
  body: 'It\'s pretty cute! This **text** is [markdown](link), so it can have ' +
    'links and *stuff*. Yay!',
  poster: {
    uid: 0,
    name: 'VivaLaPanda',
    aviUrl: 'badlink',
  },
  posted: '2018-03-28',
  children: [{
      uid: 0,
      body: 'This is a comment, it\'s angry!',
      poster: {
        uid: 0,
        name: 'VivaLaPanda',
        aviUrl: 'badlink',
      },
      posted: '2018-03-20',
      children: [{
        uid: 0,
        body: 'This is a comment, it\'s neutral!',
        poster: {
          uid: 0,
          name: 'Steve',
          aviUrl: 'badlink',
        },
        posted: '2018-03-20',
        children: [{
          uid: 0,
          body: 'This is a comment, it\'s neutral!',
          poster: {
            uid: 0,
            name: 'Craig',
            aviUrl: 'badlink',
          },
          posted: '2018-04-10',
          children: []
        }, ]
      }, ]
    },
    {
      uid: 0,
      body: 'This is a comment, it\'s happy!',
      poster: {
        uid: 0,
        name: 'Craig',
        aviUrl: 'badlink',
      },
      posted: '2018-03-28',
      children: []
    },
  ]
};




编辑:

虽然我已将此标记为已回答,因为 是一个答案,但我仍然真的有兴趣看到更优雅/更有效的内容。

EDIT2:

对于后人:我最终决定任何Firebase解决方案都无可救药,并且只使用了DGraph来获取数据,Firebase坐在前面用于Auth。

2 个答案:

答案 0 :(得分:3)

这很难,因为你拥有的结构自然是递归的。显而易见的选项是每个注释都是一个集合中的新文档和每个注释,并将其作为单个文档进行回复。

每个评论作为一个新文件可以像这样工作。每个评论都有一个“postId”属性,用于指定它所属的帖子。一些评论,即对其他评论的回复,有一个“replyToId”。这两个属性相结合,允许您的客户端应用程序:

  1. 获取顶级评论(使用正确的postId查找评论,哪些评论没有replyToId)。如果您将来需要担心,顶级注释允许您限制有效负载的大小。
  2. 获取所有评论(仅使用正确的postId查找评论)。如果您不关心有效负载大小,您可以获取所有内容并找出客户端上的树结构。
  3. 如果您想要“查看回复”YouTube样式评论互动(查找具有特定replyToId的评论),请回复特定评论。这与1.一起用于限制有效载荷大小很好。
  4. 但这里的逻辑显然很复杂。

答案 1 :(得分:3)

如果有很多人评论彼此,你的孩子的方法可能会非常混乱。每个评论都有一个更好的方法:

// single comment

postUid // <- random generated by firebase
{
    postedBy: userUid
    postedTime: timestamp
    postIsChildOfUid: postUid // <- reference to an other post (optional if the comment didn't respond to another comment(top-level comment))
}

这甚至不需要嵌套:)。您现在可以使用此方法轻松生成注释树,但这必须是客户端。但那应该很容易!