Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 您将如何在Firebase中为用户和朋友的集合建模?_Json_Firebase_Firebase Realtime Database_Nosql - Fatal编程技术网

Json 您将如何在Firebase中为用户和朋友的集合建模?

Json 您将如何在Firebase中为用户和朋友的集合建模?,json,firebase,firebase-realtime-database,nosql,Json,Firebase,Firebase Realtime Database,Nosql,我正在尝试使用Firebase创建一个数据库(json)。 我搜索了文档和网络,但找不到一个明确的开始方式。 我想要一个用户数据库。 每个用户(表示为UID)都应该有一个昵称和一个朋友列表 我尝试创建一个.json文件,如下所示: { users:{ } } { users:{ UID:{ nickname: hello friends: UID2 } UID2:{ nickna

我正在尝试使用Firebase创建一个数据库(json)。 我搜索了文档和网络,但找不到一个明确的开始方式。 我想要一个用户数据库。 每个用户(表示为UID)都应该有一个昵称和一个朋友列表

我尝试创建一个.json文件,如下所示:

{
  users:{

  }
}
{
  users:{
       UID:{
          nickname: hello
          friends: UID2
       }
       UID2:{
          nickname: world
          friends: UID
  }
}
并将其添加到Firebase控制台以开始使用,但无法使用。 我怎么做

数据库应如下所示:

{
  users:{

  }
}
{
  users:{
       UID:{
          nickname: hello
          friends: UID2
       }
       UID2:{
          nickname: world
          friends: UID
  }
}
我不知道我是否做对了,所以我非常感谢你们在这个问题上给我的任何帮助。
提前谢谢

似乎是一个好的开始。不过我要做两个改变

  • 把名单分开
  • 将好友保持为一个集合,而不是单个值或数组
  • 把名单分开 使用Firebase数据库时的一个基本建议是保持数据结构浅/平。原因有很多,你至少有两个

  • 使用当前的数据结构,假设要显示用户名列表。您只能通过收听
    /users
    来获取该列表。这意味着您不仅可以获取每个用户的用户名,还可以获取他们的好友列表。您向用户显示所有这些数据的可能性很小,因此这意味着您只是浪费了他们的一些带宽

  • 假设您想让每个人都能阅读用户名列表。但您只希望每个用户能够阅读自己的好友列表。您当前的数据结构使得这很困难,因为和

  • 更好的结构是将用户配置文件列表(当前仅为其名称)与每个用户的好友列表分开

    把朋友们作为一个整体 您当前只有一个
    friends
    属性值。当你开始构建应用程序时,你需要存储多个好友。最常见的方法是存储UID数组或列表:

    [ UID1, UID2, UID3 ]
    

    不幸的是,这些数据结构的类型错误。数组和第二个集合都是列表:一个(可能)非唯一值的有序集合。但是,朋友的集合不一定要订购,它必须是独一无二的。我要么在收藏中,要么不在收藏中,我不可能多次出现在收藏中,而且顺序通常并不重要。这就是为什么您经常使用上述模型查找
    朋友.contains(“UID1”)
    ref.orderByValue().equalTo(“UID1”)
    操作

    更好的模型是将数据存储为一个集合。集合是无序值的集合,这些值必须是唯一的。非常适合收集朋友。为了将其存储在Firebase中,我们使用UID作为集合的键。因为我们不能存储没有值的键,所以我们使用
    true
    作为伪值

    这就产生了这个数据模型:

    {
      users:{
         UID:{
           nickname: hello
         }
         UID2:{
           nickname: world
         }
      }
      friends:{
         UID:{
           UID2: true
         }
         UID2:{
           UID: true
         }
      }
    }
    

    一般来说,NoSQL数据建模和Firebase数据建模还有很多要说/要学的。要了解这一点,我建议大家阅读和观看。

    非常感谢!真的帮助我更好地理解了事情!这是可行的,但如果你需要找朋友的朋友,或者找18岁以上的朋友,你就必须求助于其他解决方案。可能是第三方服务器,在客户端进行过滤,或者使用云功能。在任何情况下,一旦你需要这种关系和查询,你可能已经超过了像Firebase(或Mongo)这样的数据库。@SebastianDenis他解释道,这意味着你不仅可以得到每个用户的用户名,还可以得到他们的朋友列表。如果某些用户有多达200个朋友,并且在您的一个视图中(例如管理员页面中的用户表视图),在您的结构中,您在查询用户列表时会得到大量不必要的数据。@Frank,如果我必须显示某个特定用户的所有朋友的昵称,该怎么办?我应该获取所有用户的昵称并在客户端进行筛选吗?或者我应该询问每个朋友?