Я бы предложил схему по этим направлениям:
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
Если у вас есть пользовательские данные, которые не являются буквенно-цифровыми, это может немного раздражать, но по большей части такая схема довольно гибка для хранения различных свойств, связанных с родительской записью.