我正在开发一个使用第三方服务(Facebook,Google等)对用户进行身份验证的应用程序。我给每个用户一个与他们的第三方ID相关联的内部id(uuid v4)。现在,我的(猫鼬)用户文档模型看起来像这样:
var user = new mongoose.Schema({
uuid: {type: String, required: true, unique: true, index: true, alias: 'userId'},
fbid: {type: String, required: false, index: true, alias: 'facebookId'},
gid: {type: String, required: false, index: true, alias: 'googleId'}
});
因为我可以查询任何ID,所以我需要所有ID的索引。我认为这可能会成为大量用户的问题(或者如果我添加更多第三方登录(Twitter,LinkedIn等)。现在,我的问题是这是否是正确的方法,或者如果有更好的解决方案。
我有一个想法是拥有多个集合,每个ID类型一个。像这样:
var user = new mongoose.Schema({
uuid: {type: String, required: true, unique: true, index: true, alias: 'userId'},
});
var facebookUser = new mongoose.Schema({
fbid: {type: String, required: false, index: true, alias: 'facebookId'},
userId: {type: Schema.Types.ObjectId, ref: 'user'}
});
这样做的好处是不会弄乱用户模型和更容易分片,但是它意味着更多的查询来检索用户,甚至更多的是创建新用户(1.如果用户存在则检查facebookUser集合,如果不存在,则创建一个新用户,保存它,然后创建一个新的facebookUser,其中包含指向该新用户的链接,然后保存该用户。
哪种方式“更好”(缩放好,处理负载等)?