gpt4 book ai didi

多个身份验证用户帐户的 MongoDB 架构设计

转载 作者:IT老高 更新时间:2023-10-28 11:06:23 26 4
gpt4 key购买 nike

我即将构建我的 node.js/express/mongoose/passport 应用程序,我正在考虑适合的 架构设计用户和帐户。

会有用户从 twitter 和 facebook 以及本地帐户登录。在稍后阶段,我希望用户将 twitter 和 facebook 与我的应用程序(甚至更多外部帐户)连接起来。

对于这种情况,我想不出一个好的解决方案。以下是我正在考虑的选项:

1.拥有文件模型和账户模型。 Profile 文档代表唯一的用户,而帐户提供用户名和密码(内部帐户)或来自 auth-provider(外部帐户)的身份验证数据。个人资料必须至少有一个嵌套帐户文档。

var ExtAccountSchema = new Schema({
type: String, // eg. twitter, facebook, native
uid: String
});

var IntAccountSchema = new Schema({
username: String,
password: String
});

var ProfileSchema = new Schema({
firstname: String,
lastname: String,
email: String,
accounts: [Account] // Pushing all the accounts in there
});

我不喜欢它的是由于不同的帐户数据导致的帐户文档不一致,而且当我的用户登录时我很难找到正确的帐户(在嵌套文档中搜索 uid 和帐户类型 -.- )

2.将所有数据保存在单个模型

var ProfileSchema = new Schema({
firstname: String,
lastname: String,
email: String,
twitter-uid: String,
facebook-uid: String
password: String
});

这很丑 -.- 找到正确的帐户数据可能更容易/更快,但维护起来并不好。

有没有更好的解决方案? 有最佳做法吗?

最佳答案

1) 您可以采用三种策略在 MongoDB 中构建数据:

  • a) 嵌入文档数组
  • b) 嵌入引用数组
  • c) 展开到父文档中

策略 (a) 是您描述的第一个策略,其中 Profile 文档包含一组 Account 子文档。

策略 (b) 与策略 (a) 类似,但您将使用对其他文档(通常在 Account 集合中)的引用数组,而不是嵌入实际文档。

策略 (c) 是您描述为“将所有数据放在一个模型中”的策略。

2) 通常认为最佳实践是使用一组嵌入文档,尤其是在其中的信息可能不同的情况下。如果它能让您的生活更轻松,您可以使用一个 key 来区分帐户的类型,如下所示:

  { 
firstname: 'Fred',
lastname: 'Rogers',
email: 'fred.rogers@example.com',

accounts: [
{ kind: 'facebook',
uid: 'fred.rogers'
},
{ kind: 'internal',
username: 'frogers',
password: '5d41402abc4b2a76b9719d911017c592'
},
{ kind: 'twitter',
uid: 'fredr'
}
]
}

3) MongoDB 允许您搜索嵌入的文档。因此,您将编写以下查询(JavaScript 语法):

 db.profile.find( 
{ email: 'fred.rogers@example.com', 'accounts.kind': 'facebook' }
);

有了适当的索引,这个查询会很快。

关于多个身份验证用户帐户的 MongoDB 架构设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11101955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com