我需要帮助来构建我的实时数据库。我有两种用户类型(用户和议员)。当用户登录时,他们可以看到咨询类别。(如:家庭、教育)当他们选择一个类别时,它会重定向到所选类别中的联机委员会列表,但不会显示任何用户。我的问题是,在登录和更改联机状态时,如何管理这两种类型的用户。
{
"categories" : {
"EDUCATIONAL" : {
"description" : "this is educational council",
"name" : "Educational Counciling",
"status" : true
},
"FAMILY" : {
"description" : "this is family counciling",
"name" : "Family Counciling",
"status" : true
}
},
"chats" : {
"COUNCILER2" : {
"jFufY3heXJgHbnuVeA9Ez1zH8ug2" : {
"MESSAGEID1" : {
"from" : "them",
"text" : "Hello how are u"
},
"MESSAGEID2" : {
"from" : "me",
"text" : "hello from me"
}
}
},
"jFufY3heXJgHbnuVeA9Ez1zH8ug2" : {
"COUNCILER2" : {
"MESSAGEID1" : {
"from" : "me",
"text" : "Hello how are u"
},
"MESSAGEID2" : {
"from" : "them",
"text" : "hello from me"
}
}
}
},
"councilers" : {
"EDUCATIONAL" : {
"COUNCILER2" : {
"description" : "peter test description",
"email" : "peter123@test.com",
"name" : "peter smith",
"online" : true,
"phone" : "0773453323"
}
},
"FAMILY" : {
"jFufY3heXJgHbnuVeA9Ez1zH8ug2" : {
"description" : "test description",
"email" : "johndoe123@test.com",
"name" : "john smith",
"online" : false,
"phone" : "0770230006"
},
"COUNCILER3" : {
"description" : "test description",
"email" : "willsmith123@test.com",
"name" : "will smith",
"online" : true,
"phone" : "0770230006"
}
}
},
"users" : {
"USERID1" : {
"email" : "kalana123@test.com",
"name" : "kalana mihiranga",
"online" : true,
"type" : "counciler"
},
"USERID2" : {
"email" : "john123@test.com",
"name" : "john smith",
"online" : true,
"type" : "user"
},
"jFufY3heXJgHbnuVeA9Ez1zH8ug2" : {
"email" : "johndoe123@test.com",
"name" : "john doe",
"online" : true,
"type" : "counciler"
},
"z5jDI0l1uBcK1RRce1SwMX3RL253" : {
"email" : "peter123@test.com",
"name" : "peter john",
"online" : false,
"type" : "user"
}
}
}这是我的结构外观,但我有一个问题,当议员登录如何改变我的在线状态。因为我得到所有的议员列表使用的是议会节点,而不是用户节点。当理事会成员登录时,我没有任何选择来识别他属于哪个类别。所以我不能更改市议员节点在线状态
发布于 2020-04-12 14:44:39
当理事会成员登录时,我没有任何选择来识别他属于哪个类别。所以我不能更改市议员节点在线状态
这确实是你问题的症结所在,也是解决方案的关键所在。
在使用NoSQL数据库时,您应该对数据进行建模,以允许用例。因此,如果您的当前结构不允许您为已知的评议会员( sic)找到类别,那么您应该更改结构以允许这样做,或者添加更多的数据。
例如,我会考虑以下几种选择:
将市议员存储为列表
乍一看,councilers下的JSON似乎嵌套得更深,而不是需要。如果你这样做的话:
"councilers" : {
"COUNCILER2" : {
"description" : "peter test description",
"email" : "peter123@test.com",
"name" : "peter smith",
"online" : true,
"phone" : "0773453323",
"category": "EDUCATIONAL"
}
"jFufY3heXJgHbnuVeA9Ez1zH8ug2" : {
"description" : "test description",
"email" : "johndoe123@test.com",
"name" : "john smith",
"online" : false,
"phone" : "0770230006",
"category": "FAMILY"
},
"COUNCILER3" : {
"description" : "test description",
"email" : "willsmith123@test.com",
"name" : "will smith",
"online" : true,
"phone" : "0770230006",
"category": "FAMILY"
}
},有了上面的结构,您仍然可以得到正确的顺序与firebase.database().ref("councilers").orderByChild("category")议员,但现在每个顾问也可以找到他们自己的节点,并更新他们的online状态。
存储从咨询器到其类别的附加映射
在您当前的结构中,您可以轻松地查找特定类别的顾问。然而,你不可能轻易地找到一个特定顾问的类别,这正是你现在需要的。
一种可能的解决方案是将特定的映射添加到数据库中,作为额外的顶级列表:
"counciler_categories": {
"jFufY3heXJgHbnuVeA9Ez1zH8ug2": "EDUCATIONAL",
"COUNCILER2": "FAMILY",
"COUNCILER3": "FAMILY"
}现在您可以查找顾问的类别,然后在/councilors/$category/$uid下更新他们的状态。
将联机状态与其他数据分开存储。
另一种选择是将状态分离到它自己的顶级节点中,由顾问的UID键决定:
"counciler_online": {
"jFufY3heXJgHbnuVeA9Ez1zH8ug2": true,
"COUNCILER2": false,
"COUNCILER3": true
}因此,使用这个附加结构,您可以从每个online节点中删除/councilers/$category/$uid属性,现在顾问只能在联机时更新它们的状态。
可能有更多的选择比我上面概述的三个常见的选项更多,而且这些选项中没有一个比其他的更有针对性。您必须在应用程序中选择适用于用例的方法,并在执行过程中进行修改。
我强烈建议阅读NoSQL数据建模、SQL开发人员的防火墙和了解云修复 (后者适用于不同的数据库,但早期的许多建议同样适用于其他NoSQL数据库)。
https://stackoverflow.com/questions/61167513
复制相似问题