【发布时间】:2017-10-10 06:04:45
【问题描述】:
问题是关于我为 Firebase 应用程序定义的数据结构。 它正在工作,但是我对效率和可扩展性表示怀疑。
想象一个只有一个全局聊天室的聊天应用程序 但您只会看到与您有关系的用户的消息。 从这个意义上说,“关系”意味着您共享相同的组成员身份。 这些是组:
+---------+---------+---------+
| Group A | Group B | Group C |
+---------+---------+---------+
| User1 | User4 | User7 |
| User2 | User5 | User8 |
| User3 | User6 | User1 |
+---------+---------+---------+
请注意,User1 是 A 组和 C 组的成员。 概念是 User1 将看到 User 2、3、7 和 8 发布的消息 而 User4 只会看到来自用户 5 和 6 的消息。 为此,每个用户的关系都存储在 Firebase 实时数据库中,如下所示:
Friends
├── User1
│ ├── User2: true
│ ├── User3: true
│ ├── User7: true
│ └── User8: true
├── User2
├── User1: true
└── User3: true
等等。出于演示目的,我在这里使用用户名,实际上,这些是 Firebase UID。 显然,这需要将许多 (users_per_group)² 条目写入数据库。 每组可能的组数和用户数是无限的。 消息像这样添加到 Firebase:
Messages
├── User1
│ ├── timestamp
│ │ └── message: "This is a message"
│ ├── timestamp
│ │ └── message: "This is another message"
├── User2
├── timestamp
│ └── message: "..."
通过以下 Firebase 安全规则可以轻松实现权限的实际执行:
"Messages": {
"$uid": {
// allow read only if the current user is a friend of the message creator
// OR if the user is the creator of the message
".read": "(root.child('Friends/' + $uid + '/' + auth.uid).val() === true || $uid === auth.uid)"
}
}
这是构建数据的推荐方法吗? 由于跟踪用户关系所需的数据量,我有点不确定。
【问题讨论】:
标签: firebase firebase-realtime-database firebase-security