对Firebase数据库结构的建议

时间:2017-07-01 23:21:12

标签: ios swift firebase firebase-realtime-database nosql

我有房间可以容纳用户可以发布的子房间。我只想向用户显示不到24小时的用户帖子。

例如:

Cats
   kittens
      users : 10
      posts :
         ksjdflkjaslkdjf
              userUID : 123
              postCaption : "I like kittens"
              postTimestamp : 203940340930

所以在这里,如果用户进入猫室,进入小猫的子房间,并想看到关于小猫的帖子,我只想返回时间戳不到24小时的帖子老。

我不确定是构建数据库的最有效方法。现在设置的方式的问题是,如果有1000万个小猫帖子,每次用户想要加载帖子时,firebase必须通过每个帖子并检查时间戳以查看它是否有效。

另一种选择可能是:

  Rooms:
    Cats
       kittens
          users : 10
          posts :
            post1UID : 209384938942024234 //The value here would be the timestamp
            post2UID : 309238942024234

   Posts : 
      209384938942024234
          userUID: 123
          postCaption : "....." 
          postTimestamp : 209384938942024234

我会查询只有有效时间戳的帖子,并使用帖子UID去抓帖子。

在开始之前,有关最佳方法的建议吗? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

您可以简单地查询帖子列表,仅查询过去24小时内的帖子。在you can't enforce this with security rules期间,您至少可以使代码做正确的事情。

但这非常浪费:在你的应用程序上线超过24小时之后,你就会查询你已经知道从不匹配的数据。

为了防止这种情况:在Nobase数据库(如Firebase)中,您经常会针对应用的特定用例对数据建模。因此,如果您希望用户查看过去24小时内的帖子列表,您应该为数据库建模,以获得过去24小时内的帖子列表。

您可以通过两种方式执行此操作:

  1. 每个房间只保留最近24小时的帖子。因此,只需删除超过24小时的数据,例如添加新帖子时,或者使用cron触发的Cloud Function。或者,您可以将较旧的帖子移动到单独的节点,或者移动到BigQuery等系统,这样更适合处理此类历史数据。
  2. 保留当前结构,但添加二级索引:最后一天的帖子ID列表。一种简单的方法是将每个帖子的ID作为键,并将其时间戳保持为值:

     roomId1:
       post1UID: timestamp
       post2UID: timestamp
    

    与您的方法不同(至少就我在快速扫描中看到的那样)是索引只会发布最近24小时的帖子,因此您根本无需查询帖子(仅用于清理)。