Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 按电子邮件地址或用户ID构建用户数据_Database_Firebase_Firebase Realtime Database - Fatal编程技术网

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

Database 按电子邮件地址或用户ID构建用户数据,database,firebase,firebase-realtime-database,Database,Firebase,Firebase Realtime Database,我想让数据库中的用户以一种更易于阅读和管理的方式进行结构化。使用用户电子邮件地址作为属性名称而不是用户ID: 用户: “用户”:{ "emailaddress@domain.com":{ “id”:“DK66qu2dfUHt4ASfy36sdfYHS9fh”, “名称”:“显示名称”, “团体”:{ “主持人”:没错, “用户”:正确 } }, {...} } 因此,如果我在一个组中有一个用户列表,那么它们可以作为电子邮件列表而不是用户ID列表来读取 组,例如: “组”:{ “主持人”:{ “

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

用户:

“用户”:{
"emailaddress@domain.com":{
“id”:“DK66qu2dfUHt4ASfy36sdfYHS9fh”,
“名称”:“显示名称”,
“团体”:{
“主持人”:没错,
“用户”:正确
}
},
{...}
}
因此,如果我在一个组中有一个用户列表,那么它们可以作为电子邮件列表而不是用户ID列表来读取

组,例如:

“组”:{
“主持人”:{
“姓名”:“主持人”,
“成员”:{
"emailaddress@domain.com“:没错,
"emailaddress2@domain.com“:对
}
}
}
组而不是:

“组”:{
“主持人”:{
“姓名”:“主持人”,
“成员”:{
“DK66qu2dfUHt4ASfy36sdfYHS9fh”:正确,
“K2fkHYQDFOge3Hw7SjRaGP3N2sdo”:正确
}
}
}
但是,使用规则验证用户的属性(例如他们的组)需要我维护两个用户列表,一个类似于上面的列表,另一个本质上是ID和电子邮件地址的键值对表,这样我就可以从用户的
uid
获取用户的电子邮件地址

伪代码规则:
用户[UsersKeyVal[auth.uid]].groups.版主==true


对于firebase,什么是最可接受的做法?两者的优缺点是什么?

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

根据

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


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

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

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

users
  uid_0
   name:
   gender:
   etc
  uid_1
   name:
   gender:
   etc
底线是,一般来说,最好将节点中存储的动态数据与节点的键断开关联

为什么?

假设您构建了一个复杂的结构,其中包含对的各种链接和引用frank@mycoolcompany.com然后@mycoolcompany.com被@mynotsocoolcompany.com收购。那么,你必须进入并在整个数据库中重建对franks电子邮件的所有引用。啊

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

如果您解除数据关联,如我上面建议的结构,您只需更改节点内的电子邮件地址和其他所有内容。。。真管用

请阅读由Firebaser编写的关于堆栈溢出的回答,并回答您的问题


谢谢你,克里玛。然而,在考虑了一会儿之后,我关心的是维护另一块数据,它只是电子邮件地址和用户ID的键值对。这是必要的,因为我使用电子邮件地址作为各种ID,Firebase auth只包含身份验证用户的
uid
。如果我使用用户ID而不是电子邮件,那就没有必要了。在这种情况下,我会有一些3倍以上的冗余数据。哦,我明白了。我忘记了这一部分,因为我使用的是一个自定义的身份验证系统,我可以直接使用我的会员电子邮件来验证规则。哦,你有我可以阅读的参考资料吗?用户信息存储/安全性(如密码)是否仍由firebase处理?当然:我使用的旧文档(我在新文档中找不到)。但是这需要你有一个服务器(或者一个代理,这是我的:)哦,我明白了,谢谢你提供的信息。经过深思熟虑,我得出结论,如果我想让数据库完全可读,那么三次冗余数据是必要的。只要不能通过编程创建电子邮件+密码用户,就一定要这样。谢谢是否计划让用户直接登录Firebase,并通过Firebase仪表板手动读取和管理数据?@Jay很遗憾,如果我希望其他用户创建新的电子邮件/密码用户,则需要这样做,因为此类操作的默认行为是自动将您作为新创建的用户登录,我或其他管理员需要注销,然后返回到我们自己的帐户,然后在数据库中设置用户。通过firebase控制台添加新用户更容易,也不那么麻烦。这就是为什么我考虑让它成为人类可读的,直到它可以被编程处理为止。不过,读完你的答案后,我可能不会。杰,谢谢你的回复。这是有道理的,这正是我所寻找的洞察力类型。谢谢你把这个答案联系起来,这很有启发性。我考虑在OP中这样做的唯一原因是,我必须在数据库中手动设置用户数据并进行身份验证,因为无法通过编程方式创建电子邮件/密码用户。因此,我自己和任何需要添加新用户的人都必须直接访问firebase仪表板,而不仅仅是在站点上创建管理面板。firebase可以轻松地在代码中创建用户。我们总是这样做。给你的“管理员”用户提供一个前端用户界面,允许他们根据需要添加或更改用户,这可能会容易得多。这与我在OP中的问题无关,但怎么做呢?我知道创建新用户的唯一方法是通过
createUserWithEmailAndPassword
API方法,该方法还可以自动将您作为新创建的用户登录。添加数据库信息可以通过编程方式完成,但实际上创建用户的身份验证是不可能的。@DouglasGaskell这是一个很好的后续评论。使用2.x,开发人员可以通过代码创建用户,而无需登录。这是一个非常有趣的故事