按电子邮件地址或用户 ID 构建用户数据

Structuring user data by email address or by user ID

我想让数据库中的用户以一种更易于阅读和管理的方式构建。使用用户电子邮件地址作为 属性 名称而不是用户 ID:

用户:

  "Users" : {
    "emailaddress@domain.com":{
      "id": "DK66qu2dfUHt4ASfy36sdfYHS9fh",
      "name": "A Display Name",
      "groups": {
        "moderators": true,
        "users": true
      }
    },
    {...}
  }

因此,如果我有一个组中的用户列表,它们可以被视为电子邮件列表而不是用户 ID 列表。

组如:

  "Groups": {
    "moderators":{
      "name": "moderator",
      "members": {
        "emailaddress@domain.com": true,
        "emailaddress2@domain.com": true
      }
    }
  }

组而不是:

  "Groups": {
    "moderators":{
      "name": "moderator",
      "members": {
        "DK66qu2dfUHt4ASfy36sdfYHS9fh": true,
        "K2fkHYQDFOge3Hw7SjRaGP3N2sdo": true
      }
    }
  }

但是,使用规则来验证 属性 用户(例如他们的组),将需要我维护两个用户列表,一个类似于上面的列表,另一个本质上是 table ID 和电子邮件地址的键值对,这样我就可以从他们的 uid.

中获取用户的电子邮件地址

伪码规则:Users[UsersKeyVal[auth.uid]].groups.moderator == true

对于 firebase,什么被认为是最容易接受的table实践?两者各有什么优缺点?

我认为你的数据结构没有问题。

根据 Doc

This is a necessary redundancy for two-way relationships. It allows you to quickly and efficiently fetch your members memberships

同样使用从 firebase 生成的 UId 或您的自定义 ID(这里是您的电子邮件)不会改变 firebase 的工作方式。您只需确保您的电子邮件是独一无二的。

请不要在他们的电子邮件地址下存储用户数据!这以后会是个大麻烦。

您的用户节点应遵循 'standard' Firebase 设计模式

users
  uid_0
   name:
   gender:
   etc
  uid_1
   name:
   gender:
   etc

最重要的是,一般情况下,最好将节点中存储的动态数据与节点的键解除关联。

为什么?

假设您构建了一个复杂的结构,其中包含对 frank@mycoolcompany.com 的各种链接和引用,然后 @mycoolcompany.com 被 @mynotsocoolcompany.com 获取。那么,您将不得不进入并重建整个数据库中对弗兰克斯电子邮件的所有引用。呃

那如果有 100 或 1000 个用户怎么办@mycoolcompany.com!哎哟

如果您解除数据关联,就像我上面建议的结构一样,您只需更改节点内的电子邮件地址和其他所有内容...就可以了!

请阅读这个关于堆栈溢出的答案 - 由 Firebaser 编写并解决您的问题

Firebase data structure and url