我使用firebase作为博客站点的后端数据库。我想知道如何构建我的Firebase数据库;基于此我可以确定哪些帖子最近趋势最快。
让我们看看下面的例子。
帖子
- [帖子1]
| -PostId:Post1
| -PostName:旧的
| -PostLikes:100
| -PostCreatedTimeStamp:1483107180599
| -PostCreatedDate:20141204 / * YYYYMMDD格式的日期格式* /
- [帖子2]
| -PostId:Post2
| -PostName:NEW
| -PostLikes:40
| -PostCreatedTimeStamp:1483115276906
| -PostCreatedDate:20161204
根据上面的例子,我们可以看到,即使Post 2的喜欢数量较少,但由于它在很短的时间内获得了更多的喜欢,因此它目前处于趋势状态。 我们如何基于此构建Firebase。
我也找到了一个临时解决方案。通过创建Like系数
LikeCoefficient =((不喜欢)* 10000000)/(RecentlikedTimeStamp- createdTimestamp)。
这种方法存在缺陷。如果热门帖子停止获得喜欢。我无法更新系数。因此旧的帖子也可以介于两者之间。(我不想使用后端服务器:)。它会增加我在这个阶段不想要的成本)。
[问题数学演出:]我们可以通过创建的时间戳改进LikeCoefficient来表示最近的趋势帖子顺序。
@FireBaseteam:为什么我们不能有两个orderbychild参数。为什么团队为什么.. :( :(
答案 0 :(得分:0)
您需要第三种数据结构才能正确支持趋势。趋势算法几乎总是"指数移动平均线" (EMAS)。虽然它不是他们唯一的目的,但它们通常用于股票交易,你可以在这里找到解释和公式:
http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages
基本上你想要做的是维护一个得分元素列表。您可能只有一个组件可以考虑使项目成为"趋势",例如发布评论,在这种情况下,每个项目的得分仅为1.0。但你也可以做一些聪明的事情,比如说"顶级回复值1.0,而第二级回复值得0.5"。您可以在这些算法中包含您想要的任何内容 - 评论,回复,星级评分或投票,竖起大拇指,分享等。
了解您希望如何对这些内容进行加权或评分,并创建将这些得分条目添加到数据集时的代码。在每个条目中,您可能希望存储有关创建它的用户,正在执行的操作,该操作的分数以及发生的日期时间(以毫秒为单位)的信息。
从那里,您只需应用EMA公式为每个帖子创建总体加权分数。关于EMA的一个非常好的事情是,尽管您想要记住分数中所有条目的列表以供稍后参考,但是没有必要查询它们以调整每个新值的EMA。可以使用上面链接中的公式,仅根据手头的数据计算EMA。因为EMA偏好"更新"数据,它们会自动指示趋势项目,因为较旧的项目会丢失。
您需要一种方法来维护这些值,通常是后台/批处理过程,有助于过期旧项目。或者,批处理可以计算CURRENT趋势项,并将其发布到可以立即显示的/trending-posts
集合中。这个选项是我个人的偏好,YMMV。