如何有效地查找Firebase中一组节点中是否包含元素?

时间:2018-12-28 02:02:49

标签: firebase firebase-realtime-database

我正在构建一个社交媒体数据库架构,其中包含用户,关注者,标签和帖子。为了符合Firebase模型,我按照Firebase文档中的建议对结构进行了展平,如下所示。我遇到的问题是,当用户选择一个标签并从tagPosts表中看到一堆帖子时,这些帖子都与返回的标签相关,然后我想首先显示当前用户关注者创建的帖子。

在SQL中,这将通过一个内联查询来完成,该查询将针对特定标签返回的帖子检查用户关注者。 但是,在firebase中,我不确定如何执行以下操作,而不下载在tagPosts中的tagID节点下包含的所有帖子,并针对当前用户userID,对照Followers节点检查每个帖子的创建者。对于100个用户中的100个帖子,此操作很容易失控。我已经尝试根据此答案How do I check if a firebase database value exists?和本文From SQL to Firebase — How to structure the DB for a social network app进行建模。我对数据的结构不好吗?我如何解决这个问题?

 `
Users-
     -userID1
         -misc. userData
     -userID2
          -misc. userData
Followers-
     -userID1
        -userIDOfFollower1   
        -userIDOfFollower2
Following-
     -userID1
        -userIDOfFollower1   
        -userIDOfFollower2

Posts-
    -postID1
       -userIDFromCreator
       -misc. PostData


Tags-
    -tagID1
       -misc. TagData
TagsUsers
    -tagID1
       -userID1
       -userID2
TagsPosts
     -tagID1
        -postID1
        -postID2

编辑-谢谢弗兰克

在故事板流程中,我们计划让用户看到一堵标签墙,这些墙是通过根据标签的属性不断更新热门分数而确定的,并且我们在该位置预测用户可能会感兴趣。然后,用户将选择一个标签,并查看与该标签相关的帖子,我希望这些帖子显示给用户关注者的帖子,而其他所有人的帖子都属于指定标签的类别。

我考虑了两种可能性,或者我优化了读取效果,在这种情况下,我必须跟踪用户关注者每次发布到标签的时间,并在用户发布的每个关注者中将tagID以及postID记录在节点中在FollowersTags的特殊节点中,该节点具有为每个userID列出用户的列表,以及该用户发布的所有关注者的列表,对于该帖子,该用户的所有关注者将直接为每个帖子创建100的写入次数,而该帖子与朋友拥有的关注者的数量成正比。

*creates a list of posts to a specific tag made by followers
FollowersTags
    -userID1_tagID1(composite key)
            -postID1
            -postID2
            -postID3
            -postID4
    -userID1_tagID2
            -postID1
            -postID2
            -postID3
            -postID4

或者我可以像上面尝试的那样优化写操作,这给我们带来了当前的困境,即必须执行100倍的查询时间,该查询次数与标签中的帖子数成正比。

围绕这两个选项是否有更好的选择?

不幸的是,在用户选择标签之前,我无法预测显示给用户的帖子。

1 个答案:

答案 0 :(得分:1)

在Firebase实时数据库中,我通常将数据库中的数据建模为屏幕上显示的数据。因此,如果每个用户都有最近相关帖子的“墙”,请考虑在数据库中进行精确建模:每个用户最近相关帖子的列表(或帖子ID)。

UserWalls
  userID1
    "timestamp_or_push_id": "postId1"
    "timestamp_or_push_id": "postId2"
  userID2
    "timestamp_or_push_id": "postId1"
    "timestamp_or_push_id": "postId3"

虽然确定要显示的内容的问题仍然相同,但对于此数据库模型,现在是写时间问题,而不是读时间问题。