1

我的应用程序从多个来源收集照片,其中每张照片(url)都使用发布图像时的时间戳作为优先级添加到 Firebase 结构中:

var data = {
   createdAt: new Date(2012, 11, 21).getTime(),
   url: 'http://placekitten.com/320/240',
   likes: 0
}

var images = new Firebase('myapp.firebaseio.com/images')
images.child(createdAt).setWithPriority(data, data.createdAt)

下一个任务是能够按时间顺序或受欢迎程度(喜欢)显示图像列表。

child_added使用事件以及按时间顺序列出和分页它们是相当简单的startAtlimit但是我不确定在按受欢迎程度查看它们时应该如何构造和查询我的数据。

我想到了一些方法,但它们都很粗糙:

  • 获取每张图片并在客户端进行排序和分页(最多有一千张图片)
  • 创建另一个 Firebase 数据结构,该结构按受欢迎程度(如 count )进行优先级排序,并将实际数据的值作为引用指针。
4

1 回答 1

2

你已经达到了我会选择的两个答案。最多有一千个,我认为您将节省时间和精力,只需在客户端上执行此操作。

想到的另一种蛮力方法是,如果您需要在服务器上完成它们并且不想复制数据,则创建索引。这作为 SQL 索引效率不高,但它仍然可行,我将把它扔在这里以产生想法。

本质上,您将拥有照片表:

/photos/$photo_id/  (prioritized by create data)

然后是一个索引:

/photos_indexed_by_likes/$photo_id  (prioritized by likes

这样,您可以执行以下操作:

FB.child('photos_indexed_by_likes').endAt().limit(10).on('child_added', function(snapshot) {
    // the snapshot contains the id of a photo, so we fetch it here
    FB.child('photos/'+snapshot.val()).once('value', function(ss) {
        addPresortedPhotoToList( ss.val() );
    });
});

通过仅实现您将在此页面上显示的记录,这是可行的。它确实会单独请求每张照片,但可能没什么大不了的,除非您为 twitter 大小的观众服务:)

这总是一个权衡。在这种情况下,您可以用存储空间换取带宽:)

更新

顺便说一句,我认为您不需要为创建数据添加排序优先级。这些值自然地按创建时间排序。

于 2013-01-09T15:54:35.797 回答