“用户已经存在”的设计方法

时间:2014-05-14 17:07:17

标签: algorithm

我正在建立注册页面。一个字段是昵称,我想验证它,如果用户尝试注册时已经存在。 我知道验证可能是来自客户端的ajax调用,但我的问题是针对后端。

这可能是验证昵称存在的步骤,避免过多调用DB并且不会占用太多响应时间?想象一下,包含昵称数据的DB表太大了。

使用包含昵称的复制数据的缓存并在用户成功注册时更新昵称是一种好方法吗?

我想复制这种行为 https://disqus.com/admin/signup/

欢迎任何形式的建议。

3 个答案:

答案 0 :(得分:2)

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 :(得分:1)

您可以保留所有昵称的哈希表,只需将其与具有相同哈希值的昵称进行比较。

答案 2 :(得分:1)

您使用的是SQL数据库吗?如果是这样,那么您通常会在unique表的Users字段中拥有username索引。这为您提供了两个好处:确保数据完整性(不可能有2个用户具有相同的用户名),并允许数据库快速响应select * from Users where username = "kos"等查询。