我尝试将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。
答案 0 :(得分:3)
这很难,因为你拥有的结构自然是递归的。显而易见的选项是每个注释都是一个集合中的新文档和每个注释,并将其作为单个文档进行回复。
每个评论作为一个新文件可以像这样工作。每个评论都有一个“postId”属性,用于指定它所属的帖子。一些评论,即对其他评论的回复,有一个“replyToId”。这两个属性相结合,允许您的客户端应用程序:
但这里的逻辑显然很复杂。
答案 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))
}
这甚至不需要嵌套:)。您现在可以使用此方法轻松生成注释树,但这必须是客户端。但那应该很容易!