在我的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
,我希望避免这种情况。
答案 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中保护此操作。