如何使用组处理不同的用户类型?

时间:2011-11-25 22:10:55

标签: php database database-schema usertype

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

用户:用户ID,用户名,密码,groupid;

组: groupid,detailsid,type,name

user_type1_details: id,other_fields

user_type2_details id,other_fields

现在,要从user_type1_details或user_type2_details中选择数据,请使用组表中的“type”字段。

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

2 个答案:

答案 0 :(得分:0)

有关用户特定的详细信息,您可以执行以下操作:

$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 );

答案 1 :(得分:0)

我会按照以下方式建议一个Schema:

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

如果您的用户详细信息不是字母数字,那么它可能会有点毛茸茸,但在大多数情况下,这种模式非常灵活,可以存储与父记录关联的不同属性。