как сохранить список номеров в базе данных - PullRequest
1 голос
/ 10 сентября 2011

Привет. Я пытаюсь сохранить информацию о группе, подгруппе и пользователе в базе данных (SQLite).Группа может иметь несколько подгрупп, и пользователь может принадлежать нескольким группам / подгруппам следующим образом.

  • Группа 1 имеет подгруппу a, b, c и пользователя A, B.
  • Группа2 имеет подгруппу d, e и пользователя B, C, D.
  • подгруппа d имеет пользователя B, D и принадлежит к группе 2.
  • пользователь B принадлежит к группе 1,2 и подгруппе a, c, d.

У него должна быть возможность поиска по группе, подгруппе или пользователю.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2011

Следующая структура таблицы делает следующие предположения:

  1. Подгруппы уникальны и различны для каждой группы и отличаются от фактических групп (отношение один ко многим, а группы не могут использоваться в качестве подгрупп).
  2. Для участия в группе пользователи должны быть членами хотя бы одной подгруппы

    GroupTable GroupID (PK) GroupName

    SubGroupTable SubGroupID (PK) GroupID (FK на GroupTable.GroupID) SubGroupName

    UserTable ИД пользователя (ПК) UserName

Теперь создайте таблицу отношений «многие ко многим», определяющую участие пользователя в одной или нескольких подгруппах:

User_Sub_Groups
    UserID (FK on UserTable.UserID)
    SubGroupID (FK on SubGroupTable.SubGroupID)

Если группы также могут быть подгруппами, то пример, предоставленный nulvinge, является одним из вариантов, хотя я бы сделал это немного иначе:

GroupTable
    GroupID (PK)
    GroupName

UserTable
    UserID (PK)
    UserName

SubGroupTable
    ParentGroupID (Composite Key on GroupsTable.GroupID)
    SubGroupID (Composite Key on GroupsTable.GroupID)

UserGroupsTable
    UserID (Composite Key on UserTable.UserID)
    GroupID (Composite Key on GroupsTable.GroupID)

Отсюда вы просто используете JOIN между различными таблицами для выполнения поиска. Например, чтобы вернуть всех пользователей, принадлежащих к определенной группе:

SELECT     
    tblUser_Group.GroupID, tblUser.*
FROM         
    tblUser_Group 
INNER JOIN  
    tblUser ON tblUser_Group.UserID = tblUser.UserID
WHERE 
    tblUserGroup.GroupID = @GroupID

Чтобы вернуть все подгруппы, членом которых является конкретный пользователь:

SELECT    
    tblGroup.GroupName AS SubGroupName
FROM         
    tblUser_Group AS UG 
INNER JOIN
    tblUser ON UG.UserID = tblUser.UserID INNER JOIN
    tblGroup_SubGroup AS GSG ON UG.GroupID = GSG.SubGroupID INNER JOIN
    tblGroup ON GSG.SubGroupID = tblGroup.GroupID
WHERE     
    tblUser.UserID = 1

И так далее. Поначалу может быть сложно продумать различные перестановки JOIN, но это очень гибкая и масштабируемая схема.

Надеюсь, это поможет!

0 голосов
/ 10 сентября 2011

Вот как я бы это сделал:

Group:
  id
  NULL overgroup_id

Membership:
  user_id
  group_id    

User:
  id

Группа с overgroup_id = NULL является группой, в противном случае это подгруппа.

Чтобы найти все users_ids в группеid gid, с подгруппами:

select user_id
from Membership
where group_id=gid
or group_id in
    (select group.id from Group where overgoup_id=gid)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...