Algorithm “设计方法”;“用户已存在”;
我在注册页面。其中一个字段是昵称,我想在用户尝试注册时验证它是否已经存在。 我知道验证可能是来自客户端的ajax调用,但我的问题是针对后端的 哪些步骤可以验证昵称的存在,避免对DB的调用过多,并且不会占用太多响应时间?假设包含昵称数据的DB表太大 使用包含昵称复制数据的缓存,并在用户成功注册时更新它,这是一种好方法吗 我想复制这种行为Algorithm “设计方法”;“用户已存在”;,algorithm,Algorithm,我在注册页面。其中一个字段是昵称,我想在用户尝试注册时验证它是否已经存在。 我知道验证可能是来自客户端的ajax调用,但我的问题是针对后端的 哪些步骤可以验证昵称的存在,避免对DB的调用过多,并且不会占用太多响应时间?假设包含昵称数据的DB表太大 使用包含昵称复制数据的缓存,并在用户成功注册时更新它,这是一种好方法吗 我想复制这种行为 欢迎任何建议。您可以保留所有昵称的哈希表,这样您只需将其与具有相同哈希值的昵称进行比较。您可以保留所有昵称的哈希表,这样您只需将其与具有相同哈希值的昵称进行比较
欢迎任何建议。您可以保留所有昵称的哈希表,这样您只需将其与具有相同哈希值的昵称进行比较。您可以保留所有昵称的哈希表,这样您只需将其与具有相同哈希值的昵称进行比较。您使用的是SQL数据库吗?如果是这样,那么在
Users
表的username
字段上通常会有一个unique
索引。这给您带来了两个好处:确保数据完整性(不可能有两个用户使用相同的用户名),并允许数据库快速响应来自username=“kos”用户的查询,如select*?如果是这样,那么在Users
表的username
字段上通常会有一个unique
索引。这给您带来了两个好处:确保数据完整性(不可能有两个用户使用相同的用户名),并允许数据库快速响应来自username=“kos”
1的用户的查询,其中username=“kos”1)首先创建这样一个过程
CREATE PROCEDURE InsertUser
@vUserName varchar(50)
,@Password varchar(50)
IF NOT EXISTS(SELECT 1 FROM tblUsers WHERE vUsername=@vUserName AND vPassword=@Password)
BEGIN
INSERT INTO tblUsers(vUsername, vPassword) VALUES(vUserName , Password)
SELECT @@IDENTITY
END
ELSE
BEGIN
SELECT -500
END
2) 编写函数以调用此SP
public int InsertUser(string vUserName, string vPassword)
{
System.Data.SqlClient.SqlConnection con = null;
try
{
con = new System.Data.SqlClient.SqlConnection("strConnectionString");
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("InsertUser", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@vUserName", vUserName);
cmd.Parameters.AddWithValue("@Password", vPassword);
con.Open();
object res = null;
res = cmd.ExecuteScalar();
con.Close();
return res != null ? Convert.ToInt32(res) : 0;
}
catch (Exception)
{
throw;
}
finally { con.Close(); }
}
public void RegisterUser(string vUserName, string vPassword)
{
try
{
int res = InsertUser(vUserName, vPassword);
if (res > 0)
{
//user registered successgully
}
else if (res == 0)
{
// a logical error occured in query
}
else if (res == -500)
{
//user already exists. Please try another
}
}
catch (Exception ex)
{
//Catch Exception here
}
}
1) 首先创建一个这样的过程
CREATE PROCEDURE InsertUser
@vUserName varchar(50)
,@Password varchar(50)
IF NOT EXISTS(SELECT 1 FROM tblUsers WHERE vUsername=@vUserName AND vPassword=@Password)
BEGIN
INSERT INTO tblUsers(vUsername, vPassword) VALUES(vUserName , Password)
SELECT @@IDENTITY
END
ELSE
BEGIN
SELECT -500
END
2) 编写函数以调用此SP
public int InsertUser(string vUserName, string vPassword)
{
System.Data.SqlClient.SqlConnection con = null;
try
{
con = new System.Data.SqlClient.SqlConnection("strConnectionString");
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("InsertUser", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@vUserName", vUserName);
cmd.Parameters.AddWithValue("@Password", vPassword);
con.Open();
object res = null;
res = cmd.ExecuteScalar();
con.Close();
return res != null ? Convert.ToInt32(res) : 0;
}
catch (Exception)
{
throw;
}
finally { con.Close(); }
}
public void RegisterUser(string vUserName, string vPassword)
{
try
{
int res = InsertUser(vUserName, vPassword);
if (res > 0)
{
//user registered successgully
}
else if (res == 0)
{
// a logical error occured in query
}
else if (res == -500)
{
//user already exists. Please try another
}
}
catch (Exception ex)
{
//Catch Exception here
}
}
如果您在
昵称
列上有索引,则查询成本应该不会太高。响应设计标签用于UI设计,因此我将其删除。@Barmar是的,但超过120M~140M的记录又如何?这无关紧要。索引意味着您不必搜索所有记录,它们可以直接找到您想要的记录。如果您在昵称
列上有索引,查询成本应该不会太高。响应设计标签用于UI设计,所以我将其删除。@Barmar是的,但是超过120M~140M的记录呢?这没关系。索引意味着你不必搜索所有的记录,它们可以让你直接找到你想要的记录。这还不错。考虑到安全性,您当然不希望此哈希表到达客户机(然后他们会列出您的所有用户名)。记住这一点,在服务器上缓存哈希表,对其执行第一次查找,并通过对数据库的查询进行验证。更新哈希表可以按时间安排,或者-如果你有大量的同时注册者-根据验证查询的频率。这还不错。考虑到安全性,您当然不希望此哈希表到达客户机(然后他们会列出您的所有用户名)。记住这一点,在服务器上缓存哈希表,对其执行第一次查找,并通过对数据库的查询进行验证。更新哈希表可以按时间安排,或者-如果您有大量的同时注册者-根据验证查询的频率。