足以验证重复的用户名吗?
所以我有这个组织的续集模型:
module.exports = (sequelize, Sequelize) => {
const Organization = sequelize.define("organization", {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true,
allowNull: false
},
organizationName: {
type: Sequelize.STRING,
allowNull: false,
notEmpty: true,
unique: {
args: 'username',
msg: 'This username is already taken!'
}
},
emailAddress: {
type: Sequelize.STRING,
allowNull: false,
validate: {
isEmail: true
},
unique: {
args: 'email',
msg: 'The email is already taken!'
}
},
physicalAddress: {
type: Sequelize.STRING,
allowNull: true
},
city: {
type: Sequelize.STRING,
allowNull: false
},
country: {
type: Sequelize.STRING,
allowNull: false
},
phone: {
type: Sequelize.INTEGER,
allowNull: true
},
websiteAddress: {
type: Sequelize.STRING,
allowNull: true
}
}, {
timestamps: false,
underscored: true,
freezeTableName: true
});
return Organization;
};
当用户向新组织注册时,我要确保输入的用户名是唯一的。
我的问题是...我的实施够吗?还是我应该在插入之前做一个organization.find
?
它确实有效,但我很担心。
我知道,使用上述方法,即使验证失败,ID也会自动递增。但是还有其他问题吗?
回答如下:如果名称不是唯一的,您将依靠数据库排除错误。这实际上应该是万不得已的做法,建议您在尝试插入之前查询表。但是,您可以查看upsert样式的操作,例如findOrCreate
附加思想:如果保留现有用户名的缓存列表并搜索before,然后尝试进行插入-作为验证过程的一部分,则对数据库的压力将减少,可伸缩性更好,并为用户带来更好的体验。理想情况下,当用户输入组织名称时,将从ajax查询中调用它。
关于一些吸引人的想法的更新:Redis是一个很好的开始。它已在所有主要提供商(如AWS,Heroku,Azure等)中广泛采用和实施。设置简单,在本地轻松设置。具有集中的共享缓存,使您可以在Web / api实例之间共享数据,查询速度将大大提高,并且在缓存的数据足够时,可以减轻数据库的负担。我喜欢ioredis驱动程序。