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

In a noSQL setting, what is an efficient way to search for child nodes?

在我的 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 个用户的树时,检索数据可能需要一些时间。

因此,构建数据以提高上述查询效率的最佳做法是什么?

我想到的一个选择是创建另一个树用户名并用所有当前用户名填充它们;例如:

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

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

但是,这需要内置许多功能,例如“add/edit/remove username in users”以及“add/edit/remove username in usernames”,我想避免这种情况。

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

ref.orderByChild('username').equalTo('albert').on('value', ...

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

您可能想要 secure/validate 正在写入的数据,这样只有 simplelogin:1 可以写入 /usernames/albert

{ rules: {
  "usernames": {
    "$username": {
      // can only write if there is no data in this place yet AND
      // the user can only write their own data
      ".write": "!data.exists() && newData.val() == auth.uid",
    }
  },
  "users": {
    "$uid": {
      "username": {
        // validate that the /username/$username has out $uid associated with it
        ".validate": "root.child('usernames').child(newData.val()).val() == $uid"
      }
    }
  }
}}

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