用于多播类型的消息广播的数据结构

时间:2014-12-11 12:08:18

标签: firebase

我们正在考虑从Pusher迁移到Firebase。我们正在考虑如何在Firebase中表示Pusher频道。

在Pusher,我们每个用户都有一个频道。因此,用户可能位于user-1频道,另一个可能位于user-2频道。

然后我们的后端/服务器将通过Pusher.trigger(message, ['user-1', 'user-2'])向这两个用户发送消息。

我认为通常会这样做:

{
    web_page_1: {
        user_1: {
            messages: [{}, {}, ..],
        },
        user_2: {
            messages: [{}, {}, ..],
        },  
        ...
    },

    web_page_2: {
        user_2: {
            messages: [{}, {}, ..],
        },  
        user_3: {
            messages: [{}, {}, ..],
        }
    },
    ....
}

问题在于:同一页面的用户1和用户2可能有很多共同的消息。有没有办法减少这种重复,因为这些消息可能会变得相当大,每个用户发送和存储它们可能会变得昂贵。用户1也应该无法阅读用户2的消息。

做这样的事情会很好:

{
    web_page_1: {
        message_1: {
            user_ids: [1,2,3]
            content: {},
        },
        message_2: {
            recipient_ids: [3,4,5]
            content: {},
        }
        ...
    },

    web_page_2: {
        message_1: {
            user_ids: [1,2,3]
            content: {},
        },
        message_2: {
            user_ids: [3,4,5]
            content: {},
        }
    },
    ....
}

但是,如何应用安全策略,使得消息只能由其中指定的user_id读取。

任何指针都会非常感激。

1 个答案:

答案 0 :(得分:1)

如果多播是你的用例并且消息变大,我的确会从用户那里拆分消息,并向你所显示的用户添加消息引用。

Root
    Users
        provider:344923
            Name: Akshay Rawat
            Messages
                1: true
                2: true
                3: true
        provider:209103
            Name: Frank van Puffelen
            Messages
                1: true
    Messages
        1: It's a beautiful day
        2: The sun is shining
        3: I feel good, I feel good
        4: And nothing's gonna stop me now

在上面的数据中,您可以看到您和我是用户。 provider:...是我们的uid,但可以是允许您识别当前用户的任何内容。您收到了消息1,2和3,而我只收到了消息3.我们都没有收到消息4。

我把Web_page级别用来简化一些事情。如果您确实需要该级别,可以将其添加回来。基本方法将保持不变。

然后,您的安全规则可以使用这些消息引用来查看该用户是否可以读取特定消息:

{
  "rules": {
    "Messages": {
      "$message_id": {
        ".read": "root.child('Users/'+auth.uid+'/Messages').hasChild($message_id)"
      }
  }
}

此规则定义邮件下任何子项的安全性(由$message_id标识)。如果$message_id作为当前用户(auth.uid)的消息引用,我们授予读取权限。