在noSQL设置中,搜索子节点的有效方法是什么?

时间:2015-07-26 13:04:57

标签: javascript firebase database-design nosql

在我的noSQL数据库中,我有一个树users,如下所示:

users
     /simplelogin:1
          /email: a@a.com
          /username: albert
     /simplelogin:2
          /email: b@b.com
          /username: benihana

如果我现在想检查是否使用了用户名benihana,我需要从树用户中提取所有数据,然后遍历子项child(uid).child(username)以查看是否可以找到匹配项。

这对我来说似乎是一种非常缓慢的方式,因为当你有一个让我们说10000个用户的树时,它可能需要一些时间来检索数据。

因此,构建数据以使上述查询更有效的优良做法是什么?

我想到的一个选项是创建另一个树用户名,并用所有当前用户名填充它们; e.g:

usernames
     /benihana
          /uid: simplelogin:2
     /...

然后查找用户名需要检查节点usernames/benihana是否存在。

但是,这需要构建许多功能,例如“添加/编辑/删除 username users”以及“添加/编辑/移除<{1}}中的 username,我希望避免这种情况。

1 个答案:

答案 0 :(得分:1)

您不需要让所有用户检查他们的用户名。相反,您可以使用Firebase query来获取您可以查找的用户:

Assembly
assemblyid INT

Component
componentid INT

AssemblyComponent
assemblyid INT
componentid INT
numberofcomponents INT

在树中为用户名创建单独的部分是Firebase(和其他NoSQL数据库)中的常见模式。在您的情况下,您要创建一个从用户名到他们的uid的地图,这通常称为索引。

您可能希望secure/validate正在撰写的数据,因此只有ref.orderByChild('username').equalTo('albert').on('value', ... 可以写simplelogin:1

/usernames/albert

请注意,我没有对上述内容进行测试,因此可能存在一些问题。但是这种方法显示了我如何在Firebase中保护此操作。