需要Firebase数据结构建议

需要Firebase数据结构建议,firebase,Firebase,我想跟踪和报告聊天室中的用户,但我不确定如何最好地在Firebase中构建数据 概况 每个用户都有一个唯一的用户id 聊天室总是很安静 开合 每个聊天室都有自己独特的聊天室id 用户经常进出开放的聊天室 如果聊天室关闭,用户不能进入聊天室 一个用户可能同时在多个聊天室中 获取数据 我们可以访问返回json的API,我计划每1分钟轮询一次API,找到所有聊天室(room_id),然后请求每个聊天室的所有用户(user_id) 设置数据 数据的设置完全在我们的控制之下 报告我希望能够得到 从x

我想跟踪和报告聊天室中的用户,但我不确定如何最好地在Firebase中构建数据

概况
  • 每个用户都有一个唯一的用户id
  • 聊天室总是很安静 开合
  • 每个聊天室都有自己独特的聊天室id
  • 用户经常进出开放的聊天室
  • 如果聊天室关闭,用户不能进入聊天室
  • 一个用户可能同时在多个聊天室中
获取数据 我们可以访问返回json的API,我计划每1分钟轮询一次API,找到所有聊天室(room_id),然后请求每个聊天室的所有用户(user_id)

设置数据 数据的设置完全在我们的控制之下

报告我希望能够得到
  • 从x到y日期和时间,我们看到了多少独特的用户
  • 1个用户从x到y的在线时间日期和时间
问题
  • firebase会为我在每条记录上加盖时间戳吗?或者我需要把时间写进每一张记录中吗
  • 最好使用unix纪元还是更容易理解的日期时间
  • 我应该如何在firebase中构造此数据
firebase会为我的每条记录加盖时间戳吗?或者我需要把时间写进每一张记录中吗? 不可以,但您可以使用中提到的Firebase.ServerValue.TIMESTAMP。Firebase只存储您要求它存储的内容

最好使用unix纪元还是更容易理解的日期时间? 对所有日期时间使用Firebase.ServerValue.TIMESTAMP(这是Unix历元)(如果可能的话)。与使用
new Date().getTime()
或任何其他依赖于本地计算机时间的方法(这通常是错误的,因此最终会导致数据混乱)相比,这确保了一致性和正确性

Unix历代也是整数,与Firebase的查询功能配合得很好,特别是我们可以使用
.startAt()
.endAt()
从特定的日期范围获取内容(我们将在下面的答案中看到)

我应该如何在firebase中构造此数据? 您需要问的第一个问题是“我将如何使用这些数据?”Firebase不是一个大型SQL数据库,在这里我们可以获得正确的结构,然后依靠复杂的查询来弥补我们的错误

在Firebase中构建结构时,请确保它允许您以指定的方式加载数据。这意味着,如果您知道将有一个要从中加载数据的
房间id
列表,那么您的房间结构应该基于这些id

对于一个简单的聊天室,可以考虑这样的结构(我们将使用
$
符号来表示通配符)

{
“房间”:{
$room_id:{
“用户”:{
$user\u id:true
},
“_meta”:{
闭合:布尔型
},
“信息”:{
$message\u id:{
“用户id”:$user\u id,
“文本”:”
}
}
}
},
“用户”:{
$user_id:{…}
}
}
当id为
abe
的用户加入id为
room\u one
的聊天室时,我们知道他们需要通过将位置
/rooms/room\u one/users/abe
设置为
true
来将自己标记为聊天室的活动成员

我们加入房间的功能如下所示

功能连接室(房间id){
//我们假设'ref'是对Firebase根的Firebase引用
var roomRef=参考子对象(“房间”)。子对象(房间id);
roomRef.child(“用户”).child(myUserId).set(true);
返回roomRef;
}
这是具体的。我们得到了一些信息,因为我们的数据结构是合乎逻辑的,所以我们可以轻松地假设需要编写哪些数据,而无需从Firebase加载任何数据

不过,这对于您的情况还不够好,因为您还需要报告。我们将根据您的需要逐步改进我们的结构

从x到y日期和时间,我们看到了多少独特的用户 假设你是在每个房间的基础上说话,这是一个简单的改变

{
“房间”:{
$room_id:{
“用户”:{
$user\u id:true
},
“用户历史记录”:{
$push_id:{
用户id:。。。,
时间戳:。。。
} 
},
“信息”:{
$message_id:{…}
}
}
},
“用户”:{
$user_id:{…}
}
}
我们添加
/users/$room\u id/users\u history
位置。这是用户每次进入此房间时的列表。我们增加了一点复杂性,所以我们的join-room函数如下所示

功能连接室(房间id){
var roomRef=参考子对象(“房间”)。子对象(房间id);
roomRef.child(“用户历史”).push({
用户id:myUserId,
时间戳:Firebase.ServerValue.timestamp
});
roomRef.child(“用户”).child(myUserId).set(true);
返回roomRef;
}
现在,我们可以很容易地报告在给定时间内,使用

功能室访客(房间id、开始日期时间、结束日期时间){
var roomRef=参考子对象(“房间”)。子对象(房间id),
queryedroomref=roomRef
.orderByChild(“时间戳”)
.startAt(start\u datetime.getTime())
.endAt(end_datetime.getTime());
//假设我们使用一些ES6 promise库
返回新承诺(功能(解决、拒绝){
queriedRoomRef.once(“值”,函数(用户){
/*用户将是所有用户的快照
在给定的时间范围内进入房间*/
解析(users.val());
},函数(err){
拒绝(错误);;
});
});
}
稍后我们将讨论这样做是否真正“具体”,但这是总体思路

1个用户从x到y的在线时间日期和时间 我们还没有充实我们的
/users/$user\u id
结构,但我们必须在这里这样做。在这种情况下,唯一的信息