Как обрабатывать разные типы пользователей с помощью групп? - PullRequest
1 голос
/ 26 ноября 2011

Мой вопрос касается использования приложения с двумя разными типами пользователей, и каждый тип пользователя имеет свои «поля профиля» (или подробности, чтобы взглянуть на него по-другому).Чтобы справиться с этим, я использовал структуру «Группа», чтобы объединить пользователей в группы.У меня есть следующая структура таблицы:

Пользователь: ИД пользователя, имя пользователя, пароль, groupid;

Группа: groupid, detailsid, тип, имя

user_type1_details: id, other_fields

user_type2_details id, other_fields

Теперь, чтобы выбрать данные из user_type1_details или user_type2_details,Вы используете поле «тип» в таблице групп.

Как выбрать все подробные данные, если пользователь имеет тип 1?, Как мне запросить таблицу user_type_details, если идентификатор пользователя равен 5, например?Что мне здесь не хватает?Если пользователь имеет тип 1, я хочу показать все user_type1_details для этого пользователя, если это тип 2, я хочу показать все user_type2_details.Детали в каждой из этих двух таблиц совершенно разные.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2011

Я бы предложил схему по этим направлениям:

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

Если у вас есть пользовательские данные, которые не являются буквенно-цифровыми, это может немного раздражать, но по большей части такая схема довольно гибка для хранения различных свойств, связанных с родительской записью.

0 голосов
/ 26 ноября 2011

Для конкретных деталей пользователя, вы можете сделать это:

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