这是Firebase中聊天应用的更好数据模式

时间:2017-08-27 07:17:02

标签: firebase firebase-realtime-database schema nosql

这是一个使用Firebase的群聊应用。我有几个数据模式选项,我不知道什么是更好的性能和更少的数据使用。

假设有10个房间。这个房间已经制作完成。

每个房间的id是[A,B,C,D,E,F,G,H,I,J]

选项1

  • / users

    • / $ UID /接合
      • room1 {roomId:A}
  • /间

    • room1 {roomId:A,用户:[...]}
  • / messages

    • room1 {roomId:A,消息:[...]}

选项2

  • / users

    • / $ UID /接合
      • room1 {roomId:A,lastChecked,joinedAt ...}
  • /间

    • room1 {roomId:A,用户:[],消息:[]}

哪个更好?我第一次计划使用选项1.为了减少数据使用量,我想分别处理房间的简要信息和消息。但在开发过程中,我意识到firebase的数据库是由特定的键处理的......

例如,当用户访问房间时,

  1. /users/$uid/joined更新他/她的加入会议室信息,需要

  2. /rooms/$roomKey/users更新房间的加入用户,需要roomKey,我必须使用房间的ID(A)查询

  3. 访问会议室后,在/rooms/$key/messages处获取邮件,其密钥与上述$roomKey不同。

  4. 上面是选项1的场景,如果我使用选项2,我不需要在不同的路径中再次获取消息。但是我之所以问这个问题的原因,那么如何渲染“加入房间列表”屏幕呢?每个房间都应该有一个简短的信息,如标题,用户数,未读消息数。如果我将消息发送到/rooms,则会一起查询消息。对?

    我认为消息是最大的数据量。我该如何建立这种数据结构?

2 个答案:

答案 0 :(得分:0)

我会选择2.选项,因为它更容易管理安全规则,但1.选项没有错误或错误^^

如果您想保持较小的数据大小并且不想浪费任何东西,可以选择以下结构:

@[Link("soundio")]
lib LibSoundio
  MAX_CHANNELS = 24

  struct ChannelLayout
    name : LibC::Char*
    channel_count : LibC::Int
    channels : ChannelId[MAX_CHANNELS]
  end

  enum ChannelId
    Invalid = 0
    FrontLeft = 1
    FrontRight = 2
    FrontCenter = 3
    # ...
  end
  # ...
end

现在你只加载当前所需的孩子。但是你的安全规则仍然很紧凑。

答案 1 :(得分:0)

我认为更好的选择是创建一个“收集室”和“邮件”,这是由于每个文档的大小限制所致,因此如果您需要很大或不知道邮件数。因此,更好或更可取的用法是类似于图像附件。

这样,您对文档的邮件大小限制没有任何问题(1Mib)。以及用于房间和可搜索的元数据。

Map firestore