2016-03-07 84 views
1

我正在为我的网站设计一个用户注册表,我们需要通过用户名/电子邮件/手机使用相同的密码来支持登录。如何使用用户名/电子邮件/移动设备支持登录来设计用户表?

用户可以通过用户名,电子邮件或手机注册,一旦他们获得注册,他们可以绑定他们的电子邮件或电话。

这里是我想到的是表,但它也存在一些问题:

user_id是AUTO_INCREMENT

user_id | user_name | email | mobile | pwd 
-------------------------------------------------------- 
    1  test    
    2     [email protected]   
    3         123456   

下登记失效:

4  123456    // illegal, 123456 is present in mobile      
    5  [email protected]  // illegal, [email protected] is present in email         

要求仅仅是支持通过用户名/电子邮件/手机登录,并且没有关于用户名格式的限制,所以这里的用户名或电子邮件或手机必须在三个专栏中是唯一的纳秒。

似乎不可能添加跨多列的唯一约束,任何更好的解决方案?

+2

用户应该只有一行。为什么你使用'insert'来获取附加值而不是'update'? –

回答

3

如何保存user_ID的桌子,和他们的密码:

user_account (user_id int, pwd binary(128)) 

和一个单独的表来保存用户注册:

user_registration (user_id int, registration nvarchar(300), registration_type int) 

这样,你会避免属于非唯一注册分配给不同的用户,并且您的各种应用程序可以传递他们在对用户进行身份验证时处理的类型或注册。

当95%的用户基于使用移动登录时,您也避免使用一堆空值的表格(例如)。

-- user_acount data 

user_id pwd 
------- --------------- 
1  0x234524305762 
2  0x403958634589 
3  0x345656753546 

-- user_registration data --Types username=1, email=2, mobile=3 

user_id registration  registration_type 
1  '[email protected]' 2     
1  '4443332233'  3 
2  'userTWO'   1 
3  'User-Three'  1 
3  '[email protected]' 2 
3  '5554443322'  3 

你基本上是允许用户创建一个“用户名化名”为每一个不同的注册方式,而没有让他们为每个模式的值。这可以被视为对用户来说既好又灵活的登录选项;而且由于凭证的前半部分可能/可能是用户的电话号码,黑客进入账户会变得极其容易。

+0

也许在第二个表user_registration,我们需要另一个ID,因为一个用户可以结合电子邮件/移动,那么我们就需要添加绑定的物品到该表, 这似乎工作! – seaguest

+0

你会使用'registration_type'值允许单个用户拥有一个以上的注册类型。然后 –

+0

单个用户可以有许多项目在'user_registration'表,你有办法注册,或登录。 –

1

在我看来,(不知道进一步的细节您的要求),最好的方法是让每个用户必须在表中的一行:

user_id user_name email    mobile password 
1   test   [email protected] 123456 mypassword 

你只需要始终知道哪些类型您正在处理的登录(用户名,手机或电子邮件地址)在您的应用程序的每个点上,以便您知道要查看的列。

+0

对于给定的输入(用户名/电子邮件/移动),这是关键,我们如何确定使用哪种登录模式? 我想通过输入自动区分登录模式。 – seaguest

+0

除了你,没有人能回答这个问题。有什么要求?是否允许用户名格式为“xxx @ yyy.com”?用户名可以是“### - ### - ####'?如果他们可以,那么你需要让应用程序在将任何东西传回数据库之前确定它,也许可以通过下拉框或单选按钮。如果通话是从手机版本的应用程序自动完成的,那么它可能已经知道它是一个电话号码。 –

+0

在现实生活中,没有规则从字符串正确地确定类型,我觉得最大索林的解决方案是可行的。 – seaguest

相关问题