2种类型用户的数据库设计

时间:2012-11-16 20:42:25

标签: mysql database database-design single-table-inheritance class-table-inheritance

我有2种方式让用户在我的网站上创建帐户。

一个。正常登记表(电子邮件,密码) 湾通过Facebook Connect注册(fb_userid,电子邮件)

使用MySQL(InnoDB引擎)实现此操作的最佳做​​法是什么?

我的方法:

[USER]
user_id
user_type (normal/facebook)

[USER_NORMAL]
user_normal_id
user_id
email
password

[USER_FACEBOOK]
user_facebook_id
user_id
email
fb_userid

你有什么建议?

5 个答案:

答案 0 :(得分:4)

这张单表会更简单(在我看来):

  

用户(user_id,user_email,user_password,user_fbid)

您不需要“类型”,因为您可以使用CASE来确定user_fbid是否为NULL,然后是“普通”帐户,否则{{1}是user_password然后它是一个Facebook帐户。

答案 1 :(得分:3)

我会有两张桌子。

一个表应包含基本用户信息:

  

用户(user_id,user_email,user_password)

另一个表应该是通用的,并将第三方帐户链接到这些用户。例如:

  

user_ext (type,user_id,uid)

类型字段应包含服务类型(在本例中为Facebook),以及服务的唯一标识符(在本例中为Facebook用户ID)。然后它应该链接回user_id。

此策略将允许您添加用户可以在以后进行身份验证的其他服务。

答案 2 :(得分:1)

如果他们有Facebook ID,我会将所有内容保存在一张桌子上并区分它们。

答案 3 :(得分:0)

我可能更愿意将所有用户保留在1个表中。如果该用户的类型没有该字段,则可以包含null的字段。例如,如果用户正常,则fb_userid可以为null。

[USER]
user_id
user_type (normal/facebook)
email
password    
fb_userid (can be null: yess)

答案 4 :(得分:0)

如果这些是唯一的字段,那么将所有字段放在一个表中并且适当地使用NULL可能是最容易的。

但是,如果你想要一个标准化设计,你会选择这样的东西:

[USER]
user_id (PK)
email
(Other fields common to both)

[USER_NORMAL]
user_id (PK, FK to USER.user_id)
password
(Other fields specific to 'normal')

[USER_FACEBOOK]
user_id (PK, FK to USER.user_id)
fb_userid
(Other fields specific to FB)

如果'password'是唯一特定于'普通'用户的字段,并且有许多特定于FB用户的字段,那么折衷可能是有两个表:USER(如上所述,但包含'password')和USER_FACEBOOK