我想让数据库中的用户以一种让人们更容易阅读和管理的方式构建。使用用户电子邮件地址作为属性名称而不是用户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,什么被认为是最可接受的做法?两者的优点和缺点是什么?
答案 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编写并解决您的问题