首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要构造我的防火墙实时数据库

需要构造我的防火墙实时数据库
EN

Stack Overflow用户
提问于 2020-04-12 06:06:30
回答 1查看 36关注 0票数 0

我需要帮助来构建我的实时数据库。我有两种用户类型(用户和议员)。当用户登录时,他们可以看到咨询类别。(如:家庭、教育)当他们选择一个类别时,它会重定向到所选类别中的联机委员会列表,但不会显示任何用户。我的问题是,在登录和更改联机状态时,如何管理这两种类型的用户。

代码语言:javascript
复制
{
  "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"
    }
  }
}

这是我的结构外观,但我有一个问题,当议员登录如何改变我的在线状态。因为我得到所有的议员列表使用的是议会节点,而不是用户节点。当理事会成员登录时,我没有任何选择来识别他属于哪个类别。所以我不能更改市议员节点在线状态

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-12 14:44:39

当理事会成员登录时,我没有任何选择来识别他属于哪个类别。所以我不能更改市议员节点在线状态

这确实是你问题的症结所在,也是解决方案的关键所在。

在使用NoSQL数据库时,您应该对数据进行建模,以允许用例。因此,如果您的当前结构不允许您为已知的评议会员( sic)找到类别,那么您应该更改结构以允许这样做,或者添加更多的数据。

例如,我会考虑以下几种选择:

将市议员存储为列表

乍一看,councilers下的JSON似乎嵌套得更深,而不是需要。如果你这样做的话:

代码语言:javascript
复制
  "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状态。

存储从咨询器到其类别的附加映射

在您当前的结构中,您可以轻松地查找特定类别的顾问。然而,你不可能轻易地找到一个特定顾问的类别,这正是你现在需要的。

一种可能的解决方案是将特定的映射添加到数据库中,作为额外的顶级列表:

代码语言:javascript
复制
"counciler_categories": {
  "jFufY3heXJgHbnuVeA9Ez1zH8ug2": "EDUCATIONAL",
  "COUNCILER2": "FAMILY",
  "COUNCILER3": "FAMILY"
}

现在您可以查找顾问的类别,然后在/councilors/$category/$uid下更新他们的状态。

将联机状态与其他数据分开存储。

另一种选择是将状态分离到它自己的顶级节点中,由顾问的UID键决定:

代码语言:javascript
复制
"counciler_online": {
  "jFufY3heXJgHbnuVeA9Ez1zH8ug2": true,
  "COUNCILER2": false,
  "COUNCILER3": true
}

因此,使用这个附加结构,您可以从每个online节点中删除/councilers/$category/$uid属性,现在顾问只能在联机时更新它们的状态。

可能有更多的选择比我上面概述的三个常见的选项更多,而且这些选项中没有一个比其他的更有针对性。您必须在应用程序中选择适用于用例的方法,并在执行过程中进行修改。

我强烈建议阅读NoSQL数据建模SQL开发人员的防火墙了解云修复 (后者适用于不同的数据库,但早期的许多建议同样适用于其他NoSQL数据库)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61167513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档