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

时间:2016-06-06 06:57:46

标签: database firebase firebase-realtime-database

我想让数据库中的用户以一种让人们更容易阅读和管理的方式构建。使用用户电子邮件地址作为属性名称而不是用户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
      }
    }
  }

但是,使用规则来验证用户的属性(例如他们的组),需要我维护两个用户列表,一个像上面的列表,另一个基本上是一个ID&#的键值对表。 39; s和电子邮件地址,以便我可以从uid获取用户的电子邮件地址。

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

使用firebase,什么被认为是最可接受的做法?两者的优点和缺点是什么?

2 个答案:

答案 0 :(得分:2)

在我看来,您的数据结构没有问题。

根据Doc

  

这是双向关系的必要冗余。它允许您快速有效地获取您的成员会员资格

同样使用来自firebase的生成的UId或您的自定义ID(此处为您的电子邮件)不会改变firebase的工作方式。您只需要确保您的电子邮件是唯一的。

答案 1 :(得分:1)

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

您的用户节点应遵循“标准”Firebase设计模式

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

最重要的是,通常,最好将存储在节点中的动态数据与节点的密钥取消关联。

为什么?

假设您使用各种链接和对frank@mycoolcompany.com的引用构建了一个复杂的结构,然后@ mycoolcompany.com获取@ mycoolcompany.com。那么,您将需要进入并重建对整个数据库中franks的电子邮件的每个引用。啊。

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

如果您取消关联数据,例如我的上述建议结构,您只需更改节点内的电子邮件地址以及其他所有内容......只是有效!

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

Firebase data structure and url