Algorithm “设计方法”;“用户已存在”;

Algorithm “设计方法”;“用户已存在”;,algorithm,Algorithm,我在注册页面。其中一个字段是昵称,我想在用户尝试注册时验证它是否已经存在。 我知道验证可能是来自客户端的ajax调用,但我的问题是针对后端的 哪些步骤可以验证昵称的存在,避免对DB的调用过多,并且不会占用太多响应时间?假设包含昵称数据的DB表太大 使用包含昵称复制数据的缓存,并在用户成功注册时更新它,这是一种好方法吗 我想复制这种行为 欢迎任何建议。您可以保留所有昵称的哈希表,这样您只需将其与具有相同哈希值的昵称进行比较。您可以保留所有昵称的哈希表,这样您只需将其与具有相同哈希值的昵称进行比较

我在注册页面。其中一个字段是昵称,我想在用户尝试注册时验证它是否已经存在。 我知道验证可能是来自客户端的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的记录呢?这没关系。索引意味着你不必搜索所有的记录,它们可以让你直接找到你想要的记录。这还不错。考虑到安全性,您当然不希望此哈希表到达客户机(然后他们会列出您的所有用户名)。记住这一点,在服务器上缓存哈希表,对其执行第一次查找,并通过对数据库的查询进行验证。更新哈希表可以按时间安排,或者-如果你有大量的同时注册者-根据验证查询的频率。这还不错。考虑到安全性,您当然不希望此哈希表到达客户机(然后他们会列出您的所有用户名)。记住这一点,在服务器上缓存哈希表,对其执行第一次查找,并通过对数据库的查询进行验证。更新哈希表可以按时间安排,或者-如果您有大量的同时注册者-根据验证查询的频率。