我有一个小项目,我的数据有一些SQL设计问题。
假设我的DB中有两个表:
Contacts
ID
name
privateemail1
privateemail2
office email我也有团体
ID
Groupname将它们链接到一起的最佳方法是什么,以便我也能够在组中使用组的分发列表?
如果我用
ID
GroupID
ContactID我看不出如何将嵌入的子组与主组相匹配。
组,如
主要乐队,如管弦乐团演奏者;歌手
分组,如风笛手、弦乐手、男歌手、女歌手等。
修正的问题:上面的例子不能涵盖所有的变化.任何组都可以成为子组或主组,如Outlook分发列表?
只要看看我非常感激的评论,我很高兴能看到一个CREATE,和一个DELETE示例。这将带来更多的关注,并希望更多的结果。
我希望这不是太愚蠢的问题,但作为一个初学者,我花了几个小时才发布这篇文章。谢谢你提前提供帮助
发布于 2011-08-25 14:06:30
我用一张两用桌子解决了这个问题:
表:小组成员
id
groupID
linktype
linkIDlinktype可以是一个文本字段('user','group'),它很好,而且可读性很好(如果您正在进行自己的SQL访问,它可能值得进行小的性能测试),或者您可以使用一个INT字段,其中(1,2)其中每个字段对您都有意义。
要查找第2组中的所有用户:
SELECT linkID as userID FROM groupMemberships
WHERE groupID=2 AND linktype='user';查找所有子组:
SELECT linkID as groupID FROM groupMemberships
WHERE groupID=2 AND linktype='group';像这样的双表的一个问题是,当您想要获取所有组用户时,但是您不知道它们的子组可能是多少个。如果您可以确定只有一个级别的子组,那么您可以:
SELECT linkID as userID FROM groupMemberships
WHERE groupID=2 and linktype='user'
UNION
SELECT sg.linkID as userID FROM groupMemberships g,groupMemberships sg
WHERE g.groupID=2 AND g.linktype='group'
AND sg.groupID=g.linkID AND sg.linktype='user'如果你有两个层次的子组,你需要两个联盟等等。当您有n子组时,您需要N个联合,这是一个痛苦的编写,而且效率低下。
另一种解决方案是保持contacts表和groups表相同,只需将联系人链接到组表contactsGroups。
ID
groupID
userID现在(在数据库之外),当您将一个用户添加到一个组(windplayers)时,您还会自动地将它们添加到任何父组(管弦乐队)中,这样用户实际上就可以在contactsGroups表中获得两个条目。这具有相同的存储信息,但使数据检索更加容易。您甚至可以将这个子组信息存储在数据库中,尽管您已经拥有了具有对象继承或类似的代码端。
发布于 2011-08-25 14:16:58
我认为user911882的意思是有这样一个模式:
Contacts
- ID
- name
- privateemail1
- privateemail2
- office
- email
Groups
- ID
- Groupname
- ParentGroupID **foreign key which references Groups.ID**
Memberships
- ID
- GroupID
- ContactID发布于 2011-08-25 14:06:10
通过理解您的问题,您必须将一个表链接到它自己,然后您可以通过在组中添加一个列来链接到该表,让说Pid*,它的数据类型与组中的Id的数据类型相同,然后将其作为引用同一表中ID的foriegn键。我想它能解决你的问题。
https://stackoverflow.com/questions/7191681
复制相似问题