我在一周前推出了一个应用程序,现在有几百个用户。我使用的唯一身份验证提供程序是gmail,我的数据库结构如下所示:
- AllUsersInfo:
- $userEmail // example: "blah@gmail.com"
- "uid": $userUID // example: "1234567890"
- "name": $userDisplayName // example: "John Doe"
- AllUsersData
- $userUID // example: "1234567890"
- "userData": { ... }
基本上,我创建了一个节点(AllUsersInfo
)来容纳用户'电子邮件作为密钥,用户的uid和名称作为值。另一个节点(AllUsersData
)实际上包含它们在应用程序中生成的每个用户的数据作为值,其中键是他们的uid。我把这两个节点分开了,因为顶部的节点很轻,很适合搜索,而底部的节点是安全的,有更多的数据。
问题:
现在我正在添加Facebook身份验证,并且正在努力了解如何保持数据库结构的完整性。问题是,如果有人先前使用Gmail登录并且现在正在注册Facebook,那么他们的Facebook帐户的电子邮件可能与他们之前注册的gmail相同。这会导致AllUsersInfo
节点重叠,因为密钥在Firebase中必须是唯一的。
我正在努力弄清楚如何处理这些重叠案件。如果我使用新名称和uid覆盖电子邮件在AllUsersInfo
节点中的先前数据,则会使旧用户的身份验证无法搜索。如果我更改AllUsersInfo
的结构以允许多个uid和名称,则会导致一些向后兼容性问题。
有人可以帮我找到这个潜在的数据库结构重构的好解决方案吗?
答案 0 :(得分:0)
我建议的解决这个问题的方法,以及Facebook用户可能甚至没有电子邮件的另一个问题(他们使用电话号码创建了他们的帐户)如下:
通过facebook(或gmail)对用户进行身份验证后,检查他们的电子邮件是否已存在于数据库中,或者是否没有电子邮件(电话号码情况),在这种情况下会向他们显示一个屏幕,要求他们输入要使用的电子邮件这个新帐户。
不是最好的解决方案,但它解决了这两个问题。
答案 1 :(得分:-1)
目前,您的应用只有数百名用户。我建议您使用Firebase UI库来处理所有这些问题,您只需编写3-5行代码即可。
Here是Firebase UI Android库的链接。将其添加到您的项目中,然后按照these步骤将您的应用连接到Firebase。
完成后,从Firebase控制台启用Google和Facebook登录,按照步骤操作,然后将这些行添加到您的应用中。
startActivityForResult(
AuthUI.getInstance()
.createSignInIntentBuilder()
.setProviders(Arrays.asList(
new AuthUI.IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER).build(),
new AuthUI.IdpConfig.Builder(AuthUI.FACEBOOK_PROVIDER).build()
))
.build(),
RC_SIGN_IN);
现在所有测试用例都由Firebase处理,您可以高枕无忧。