【发布时间】:2011-09-10 12:25:47
【问题描述】:
您好,我正在尝试将组、子组和用户信息存储在数据库 (SQLite) 中。一个组可以有多个子组,用户可以属于多个组/子组,如下所示。
- 第 1 组具有子组 a、b、c 和用户 A、B。
- 第 2 组具有子组 d、e 和用户 B、C、D。
- 子组 d 有用户 B,D,属于组 2。
- 用户 B 属于组 1,2 和子组 a,c,d。
应该可以按组、子组或用户进行搜索。
【问题讨论】:
您好,我正在尝试将组、子组和用户信息存储在数据库 (SQLite) 中。一个组可以有多个子组,用户可以属于多个组/子组,如下所示。
应该可以按组、子组或用户进行搜索。
【问题讨论】:
下表结构做了以下假设:
用户必须是至少一个子组的成员才能加入组
组表 组 ID (PK) 组名
子组表 子组 ID (PK) GroupID(GroupTable.GroupID 上的 FK) 子组名
用户表 用户 ID (PK) 用户名
现在,创建一个多对多关系表,在一个或多个子组中建立用户参与:
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 排列可能具有挑战性,但这是一种非常灵活且可扩展的排列。
希望有帮助!
【讨论】:
我会这样做:
Group:
id
NULL overgroup_id
Membership:
user_id
group_id
User:
id
具有 overgroup_id = NULL 的组是一个组,否则它是一个子组。
要查找具有 id gid 和子组的组中的所有 users_id:
select user_id
from Membership
where group_id=gid
or group_id in
(select group.id from Group where overgoup_id=gid)
【讨论】: