我想知道如何完成数据库的结构。我正在创建简单的配对应用程序,我想创建一对多的关系。
matches
8aWcF6GQmpezfJkVnW5uYoJ2wtI3 //id for user
8oqmrMVZ57XXlunIAUEeBgKFZ0h2 //id of matched users
NzDaJNamKNVsWuP0FVaJI7b6Cuk1
XzGWMuXrFYQ6m0MMVSwvpjSV4JF2
users
8aWcF6GQmpezfJkVnW5uYoJ2wtI3
email: "test@mail.com"
uid: "8aWcF6GQmpezfJkVnW5uYoJ2wtI3"
username: "john"
NzDaJNamKNVsWuP0FVaJI7b6Cuk1
email: "test2@mail.com"
uid: "NzDaJNamKNVsWuP0FVaJI7b6Cuk1"
username: "john2"
XzGWMuXrFYQ6m0MMVSwvpjSV4JF2
email: "aaaaa@mail.ru"
uid: "8oqmrMVZ57XXlunIAUEeBgKFZ0h2"
username: "aaaaa"
但是,我无法实现子节点,没有值。因此,在Firebase控制台中无法创建上述结构。
你能给我任何建议吗?
答案 0 :(得分:1)
Firebase确实无法存储没有值的密钥。所以你有两个选择:
让我们先解决错误解决方案:制作密钥。
许多开发人员选择选项1:编造自己的密钥。这通常会导致他们使用数组:
matches
8aWcF6GQmpezfJkVnW5uYoJ2wtI3 //id for user
[ "8oqmrMVZ57XXlunIAUEeBgKFZ0h2", "NzDaJNamKNVsWuP0FVaJI7b6Cuk1", "XzGWMuXrFYQ6m0MMVSwvpjSV4JF2" ]
这看起来非常简洁,但却是错误的解决方案。数组是一个有序集合,可以多次包含相同的值。在您的数据中,每个用户只能出现一次。这意味着每次我们想要添加用户时,我们都必须执行array.contains()
。
更好的解决方案是弥补价值。我们在这里使用的价值并不重要,因此惯用价值是true
:
matches
8aWcF6GQmpezfJkVnW5uYoJ2wtI3 //id for user
8oqmrMVZ57XXlunIAUEeBgKFZ0h2: true
NzDaJNamKNVsWuP0FVaJI7b6Cuk1: true
XzGWMuXrFYQ6m0MMVSwvpjSV4JF2: true
现在数据结构在密钥中仍然具有用户ID,这也意味着每个用户ID只能在集合中一次。这基本上是Set data structure。
的Firebase数据库实现请注意true
这里没有神奇的价值。因此,如果您发现需要为每个用户保留一些数据,则可以轻松存储而不是true
。
例如,如果要显示所有朋友的姓名,可以考虑存储他们的姓名而不是true
。它将节省您必须为每个用户查找它。当然,这意味着如果用户更改其名称,您必须弄清楚要执行的操作。有关详情,请参阅此答案:How to write denormalized data in Firebase