【问题标题】:Database design for 2 types of users2种用户的数据库设计
【发布时间】:2012-11-16 20:42:24
【问题描述】:

我有两种方法供用户在我的网站上创建帐户。

一个。普通登记表(邮箱、密码) 湾。通过 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

你有什么建议?

【问题讨论】:

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


    【解决方案1】:

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

    用户(user_id、user_email、user_password、user_fbid)

    您不需要“类型”,因为您可以使用CASE 来确定@​​987654322@ 是否为NULL,那么它是一个“普通”帐户,否则如果user_passwordNULL,那么它就是一个Facebook 帐户。

    【讨论】:

    • 我认为越明确越好。如果您在一年后查看该表,您可能不记得缺少 fbid 意味着什么
    • @Ojen Field cmets 会对此有所帮助。
    • 嗯,我也是这么想的。也许我会在一个月内决定实施第三种注册方式。从长远来看,我正在考虑这一点。
    【解决方案2】:

    我会有两张桌子。

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

    用户(user_id、user_email、user_password)

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

    user_ext(类型、user_id、uid)

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

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

    【讨论】:

      【解决方案3】:

      我会把所有东西都放在一张桌子上,并通过他们是否有 Facebook ID 来区分它们。

      【讨论】:

        【解决方案4】:

        如果这些是唯一的字段,那么将所有字段放在一个表中并酌情使用 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)
        

        如果“密码”是“普通”用户特有的唯一字段,并且有许多 FB 用户特有的字段,那么折衷办法可能是有两个表:USER(如上,但包含“密码”)和 USER_FACEBOOK

        【讨论】:

        • 是的,我认为这更好,因为电子邮件适用于两种类型的用户。提到的那些键仅供参考,我可以很容易地为 user_facebook 表添加更多键,例如(个人资料链接、性别、姓名、姓氏)。
        • 我对这种方法的唯一保留是拥有多个表的可能开销。您可以简化此问题并避免多表查询。
        • 取决于特定于 FB 的字段数量(听起来可能有几个)和“正常”,折衷可能是有两个表 - USER(也包含密码,这将是 NULL对于 FB 用户)和 USER_FACEBOOK
        • 对于每个注册,我都有一对 USER 和 USER_(普通或 facebook)。我们如何才能对其中任何一个设置 NULL 值?
        • 你的意思是你有一对对象?哪种语言?无论如何,如果它更容易,那么坚持使用 2 个表 - 尽管在检索时您的目标应该是在一个查询而不是两个查询中填充 User_normal 对象和 User_Facebook 对象(或其他)
        【解决方案5】:

        我可能更愿意将所有用户保留在一张表中。如果该用户的类型没有该字段,则您可以拥有为空的字段。例如,如果用户正常,fb_userid 可以为空。

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

        【讨论】:

        • 不需要user_type,因为您可以根据fb_userid 是否为NULL 来区分用户类型。
        • 我明白这一点,但为了清楚起见,我个人不介意有一点冗余。我可能会在没有 user_type 的情况下这样做,但我认为过滤WHERE user_type='normal'WHERE fb_userid=NULL 是一个稍微简洁的解决方案。它使正在发生的事情更加明确。
        • 我认为 IMO user_type 是不必要的。为什么不让用户利用这两种注册方法呢?也许他们中的一些人可能想要输入登录名和密码,例如,如果他们的 fb 帐户被阻止,以确保安全。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 2019-04-17
        • 2012-04-29
        • 1970-01-01
        • 2014-02-08
        相关资源
        最近更新 更多