【问题标题】:How to handle different user types by using groups?如何使用组来处理不同的用户类型?
【发布时间】:2011-11-25 22:10:54
【问题描述】:

我的问题是关于拥有具有两种不同用户类型的应用程序,并且每种用户类型都有不同的“配置文件字段”(或以另一种方式查看的详细信息)。为了处理这个问题,我使用“组”结构将用户分组在一起。我有以下表结构:

用户:用户ID、用户名、密码、组ID;

组: groupid、detailsid、类型、名称

user_type1_details: id、other_fields

user_type2_details id、other_fields

现在,要从 user_type1_details 或 user_type2_details 中选择数据,您可以使用组表中的“类型”字段。

如果用户类型为 1,如何选择所有详细信息数据?例如,如果用户 ID 为 5,如何查询 user_type_details 表?我在这里想念什么?如果用户是类型 1,我想显示该用户的所有 user_type1_details,如果是类型 2,我想显示所有 user_type2_details。这两个表中的每一个的细节都是完全不同的。

【问题讨论】:

    标签: php database database-schema usertype


    【解决方案1】:

    我会建议采用以下方式的架构:

    create table Users
    (
        userID int,
        userName nvarchar(100),
        userPassword nvarchar(100),
        groupID int
    )
    
    create table Groups
    (
        groupID int,
        groupType nvarchar(100),
        groupName nvarchar(100)
    )
    
    create table Detail
    (
        detailID int,
        detailName nvarchar(100)
    )
    
    create table GroupDetailMap
    (
        groupID int,
        detailID int
    )
    
    create table UserDetailValue
    (
        userDetailValueID int,
        userID int,
        detailID int,
        value nvarchar(100)
    )
    

    这将允许您定义任意数量的组以及与这些组一起使用的任意数量或种类的详细信息。您可以使用 GroupDetailMap 表将组映射到详细信息。最后,将各个用户的值存储在 UserDetailValue 表中。

    当您想创建一个新用户时,您需要先选择一个组,然后获取需要为该用户添加的所有详细信息:

    select detailName
    from Detail
    inner join GroupDetailMap on GroupDetailMap.detailID = Detail.detailID
    where GroupDetailMap.groupID = @groupID
    

    将所有详细信息保存在 UserDetailValue 表中。然后,当您想显示用户的详细信息时,只需查询该用户的详细信息:

    select Users.*, detailName, value
    from Users
    inner join UserDetailValue on UserDetailValue.userID = Users.userID
    inner join Detail on Detail.detailID = UserDetailValue.detailID
    

    如果您有非字母数字的用户详细信息,它可能会有点麻烦,但在大多数情况下,这种模式对于存储与父记录关联的各种属性非常灵活。

    【讨论】:

    • 您可以处理非字母数字数据,例如 blob 数据,例如头像,这在用户表中对两者都是通用的?
    • 头像似乎对所有用户来说都是通用的,因此我可能会将其存储在用户表或特殊头像表中。然而,在过去,当我为父记录有多种类型的属性(浮点数、整数、字符串等)时,我需要保留这些类型,但无法获得除了转换字符串之外,我已经将 UserDetailValue 类型表分解为多个表,例如 UserDetailValueString、UserDetailValueNumber 等。但通常没有必要,因为无论如何你最终都会将其全部转储到网页之类的东西上。
    • 当有多种用户类型发布 cmets 时,如何选择多个用户详细信息?例如,显示用户名(或公司名称)取决于他们所在的组、他们的评论以及指向所有用户的 cmets(如果他们在业务组中)的链接? cmets 将用于论坛中的帖子。
    【解决方案2】:

    对于用户特定的详细信息,您可以这样做:

    $userid = 5;
    $tablelookup = array( 1 => "doctor_details", 2 => "user_details" );
    $result = mysql_query( "select u.userid, u.username, u.password, g.detailsid, g.type from User u, Group g where u.userid=" . $userid . " and u.groupid=g.groupid", $db );
    $data = mysql_fetch_row( $result );
    

    然后将检索到的数据值输入

    $tablename = $tablelookup[$data[4]];
    $detailsresult = mysql_query( "select * from $tablename where id=" . $userid, $db );
    $details = mysql_fetch_row( $detailsresult );
    

    【讨论】:

    • 我是否需要在详细信息表中添加用户 ID 列?我想返回用户特定的详细信息
    • 太好了,在这种情况下,您如何保持表之间的引用完整性?
    • 重新阅读您的答案,这绝对不是我的意图!哈哈 - 用户只能属于一个组,并且所有用户的详细信息都是不同的。你能告诉我如何返工我的桌子吗??
    • 这更难。您可能想查看:link。我不确定这是否是 100% 的解决方案,因为答案似乎暗示父表和子表之间存在完美对齐。无论如何,请阅读它,希望它可以帮助您度过最后的障碍。 :)
    • 在那里,修改了答案以根据组中的类型从适当的表中检索 user_details。这种方式比较简单。
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 2020-10-25
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多