事务中的Firebase多位置更新?

时间:2016-06-06 12:03:33

标签: firebase firebase-realtime-database

我需要帮助找出在我的用例中使用firebase的最佳方法。我正在制作推特克隆,但与FireFeed不同,我的帖子是可变的。

我的数据库结构如下:

房间,基本上是您可以订阅的帖子的源。会员可以在该会议室写帖子:

  1. rooms / {roomId} / posts / {postId} / - >具有标题,评论数量,喜欢等属性的帖子摘要
  2. rooms / {roomId} / users / {userId} / - >订阅此房间的所有用户的列表
  3. rooms / {roomId} / info / - >房间大小,类型,名称等
  4. 用户,所有用户的全局列表:

    1. users / {userId} / feed / {postId} - >所有房间的总和/ {roomId} / posts /来自用户订阅的所有房间
    2. users / {userId} / rooms / {roomId} - >用户订阅的所有房间的列表
    3. 帖子,实际帖子内容的全球列表:

      1. posts / {postId} / comments / {commentId} - >嵌套评论
      2. posts / {postId} / users / {userId} - >希望在此帖子上发送推送通知的用户
      3. posts / {postId} / info / - >评论,喜欢,作者,发布日期等的数量
      4. posts / {postId} / content / - >实际内容
      5. 学校,房间清单:

        1. schools / {schoolId} / rooms / {roomName} / info - >学校的房间清单。房间名称在学校内是独一无二的
        2. schools / {schoolId} / admins / {userId} - >具有不同授权规则的管理员列表
        3. 现在,前两个用例很好。困惑在于如何制作和编辑帖子的引用。我的用例是:

          用例0:用户想要创建一个房间。

          1. 多位置将房间对象更新为/ rooms /和适当的房间摘要对象到学校/ {schoolId} / rooms /,以及users / {userId} / rooms /.
          2. 用例1:用户想要订阅房间。

            1. 在rooms / {roomId} /上运行交易。将{userId}添加到rooms / {roomId} / users /,并将房间大小增加1。
            2. 在事务完成时,拍摄该快照并执行多位置更新。将房间/ {roomId} /帖子复制到用户/ {userId} / feed,将{roomId}添加到user / {userId} / rooms /并将新大小写入/ schools / {schoolId} / rooms / {roomName} / info
            3. 如果multiwrite失败,请从rooms / {roomId} / users /.
            4. 中删除{userId}

              用例2:用户想要发帖到房间。

              1. 从rooms / {roomId} / users
              2. 中检索用户列表
              3. 多位置更新所有用户订阅源和带有帖子摘要和帖子对象的全局帖子表。
              4. 问题在于,如果另一位用户在我们的用户检索用户列表后立即加入此会议室,那么他就不会参与多位置更新以接收此新帖子。

                当我试图更新帖子上的评论数量时,我面临类似的难题。如果帖子有15个评论,并且2个人同时在此帖子中添加新评论,则全局帖子对象在交易完成后将正确更新为17,但根据粉丝输出的顺序,每个人的帖子摘要对象可能有16条评论。当用户加入房间时,房间的大小也是如此。

                我应该怎么做?有没有办法更好地建模我的数据,或者有没有办法在交易过程中正确地进行多位置更新?

1 个答案:

答案 0 :(得分:0)

当我看到您的用例时,我认为您的数据模型有点过于复杂。

Firebase对我而言就像:

  1. no-sql data storage
  2. pub / sub server
  3. 支持网络套接字的前端服务器
  4. 客户端库
  5. 这意味着我不会存储此users/{userId}/feed/{postId},而是在客户端登录时执行以下操作:

    1. “连接”到用户订阅的每个房间
    2. 从订阅的房间中提取所有最近的帖子
    3. 订购帖子客户端
    4. 这样,当有人发表新帖子/评论时,它只会在一个位置rooms/{roomId}/posts/

      上写

      我也会删除你喜欢/发布/评论的计数器,当我想要这个信息时,请调用方法numChildren以避免不必要的并发访问。