MySQL中的电子邮件组
我有一个小项目,我的数据有一些SQL设计问题 假设我的数据库中有2个表:MySQL中的电子邮件组,mysql,sql,Mysql,Sql,我有一个小项目,我的数据有一些SQL设计问题 假设我的数据库中有2个表: Contacts ID name privateemail1 privateemail2 office email 我有小组 ID Groupname 将它们链接在一起的最佳方式是什么?我也可以在组中使用组 如果我做了一个成员表 ID GroupID ContactID 我看不出如何将嵌入的子组与主组相匹配 例如 主要群体,如管弦乐队成员;歌手 分组,如管乐器手、弦乐手、男歌手、女歌手等 修改后的问题:上述示例无法涵
Contacts
ID
name
privateemail1
privateemail2
office email
我有小组
ID
Groupname
将它们链接在一起的最佳方式是什么?我也可以在组中使用组
如果我做了一个成员表
ID
GroupID
ContactID
我看不出如何将嵌入的子组与主组相匹配
例如
主要群体,如管弦乐队成员;歌手分组,如管乐器手、弦乐手、男歌手、女歌手等 修改后的问题:上述示例无法涵盖所有变化。。。任何组都可以成为子组或主组,如Outlook通讯组列表 只需查看评论,我非常感谢,如果能够看到一个CREATE、SELECT和所有组以及一个DELETE示例,那就太好了。这将带来更多的关注,并有望带来更多的结果
我希望这不是一个很愚蠢的问题,但作为一个初学者,我在发布这篇文章之前花了几个小时。。。提前感谢您的帮助通过理解您的问题,您必须将一个表链接到自身,然后您可以通过在组中再添加一列来链接到该表,让说Pid*,它将与组中Id的数据类型*相同,然后将其作为同一表中引用ID的外键。我想它会解决你的问题。通过理解你的问题,你必须将一个表链接到它本身,然后你可以通过在组中添加一列来链接到该表,让说Pid*,它的数据类型*与组中Id的数据类型*相同,然后将其作为同一表中引用ID的外键。我想它会解决你的问题。我已经用两用表解决了这个问题: 表:集团成员资格
id
groupID
linktype
linkID
linktype
可以是一个好读的文本字段(“用户”、“组”)(如果您自己进行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个联合,这是一个难以编写且效率低下的问题
另一种解决方案是保持您的联系人
和组
表相同,只需将联系人链接到组-表联系人组
ID
groupID
userID
现在,代码端(数据库之外)当您将用户添加到组(WindPlayer)时,您也会自动将其添加到任何父组(orchestra),因此用户实际上会在contactsGroup
表中获得两个条目。这具有相同的存储信息,但使数据检索更容易。您甚至可以将此子组信息存储在数据库中,尽管您已经有了对象继承或类似的代码端。我已经用两用表解决了这个问题:
表:集团成员资格
id
groupID
linktype
linkID
linktype
可以是一个好读的文本字段(“用户”、“组”)(如果您自己进行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个联合,这是一个难以编写且效率低下的问题
另一种解决方案是保持您的联系人
和组
表相同,只需将联系人链接到组-表联系人组
ID
groupID
userID
现在,代码端(数据库之外)当您将用户添加到组(WindPlayer)时,您也会自动将其添加到任何父组(orchestra),因此用户实际上会在contactsGroup
表中获得两个条目。这具有相同的存储信息,但使数据检索更容易。您甚至可以将此子组信息存储在数据库中,尽管您已经有了对象继承或类似的代码端。我认为user911882的意思是拥有如下模式:
Contacts
- ID
- name
- privateemail1
- privateemail2
- office
- email
Groups
- ID
- Groupname
- ParentGroupID **foreign key which references Groups.ID**
Memberships
- ID
- GroupID
- ContactID
我认为user911882的意思是有这样一个模式:
Contacts
- ID
- name
- privateemail1
- privateemail2
- office
- email
Groups
- ID
- Groupname
- ParentGroupID **foreign key which references Groups.ID**
Memberships
- ID
- GroupID
- ContactID
谢谢,我只是想解决同样的问题。这个小组来自哪里?她在小组里吗?或者存在另一个已注册的详细信息?子组是普通组,只是您可以使用任何组作为主组或子组。您可能还希望进一步规范化联系人
表,尽管这可能符合您的目的。您能再解释一下如何做到这一点吗?我会从中学习。谢谢谢谢,我只是想解决同样的问题。这个小组是从哪里来的?她在小组里吗?或者存在另一个已注册的详细信息?子组是普通组,只是您可以使用任何组作为主组或子组。您可能还希望进一步规范化联系人
表,尽管这可能符合您的目的。您能再解释一下如何做到这一点吗?我会从中学习。谢谢你的详细解释。谢谢鲁杜,这里有“随机”的联系,一个人可以是歌手,也可以是号角手,所以这张唱片将由管弦乐队、管弦乐队、兽人托管人、号角手、独奏家、歌手组成