在MySQL表中存储组成员的最佳方法

5
我正在开发一个安卓应用程序,人们可以注册并加入组。
我有一个单独的MySQL表格用于存储用户的详细信息,另一个表格用于存储组的详细信息。但是我在将用户与组关联时遇到了问题。
用户表格将包括他的user_id, name, password, email_id, address等信息。组表格将包括group_id, group_name和关于该组的其他详细信息。
我必须能够快速轻松地获取:
  1. 所有在某个组中的用户。
  2. 某个用户已经加入的所有组。
请注意:假设你有超过100k的用户和超过1000个组。
1个回答

6
这个问题的惯用解决方法是创建一个额外的n:m映射表,其中只包含ID对 - 用户和他或她所属的组:
CREATE TABLE group_membership (
    user_id INT NOT NULL,
    group_id INT NOT NULL,
    PRIMARY KEY (user_id, group_id),
    CONSTRAINT FOREIGN KEY (user_id) REFERENCES users (id),
    CONSTRAINT FOREIGN KEY (group_id) REFERENCES groups (id)
)

例如,如果您想查询来自 my_group 的所有用户,则可以使用几个联接:

SELECT u.*
FROM   users u
JOIN   group_membership gm ON u.id = gm.user_id
JOIN   groups g ON gm.group_id = g.id
WHERE  g.name = 'my_group'

我担心这会增加存储的复杂性。 - Senthil Vidhiyakar
3
嗯,它不会增加太多存储空间,因为只是存储整数(ID),没有别的,但这是处理多对多关系的最佳解决方案。 - Naveed Ramzan
每个用户将加入n个组,而group_membership表中的最大条目数将增加到NoOfEntriesInUser * NoOfGroups。 - Senthil Vidhiyakar
感谢您提供的解决方案。如果我能得到一个更好的解决方案,我将不胜感激..!! - Senthil Vidhiyakar
4
这是正确的方法。如果您想要不同的东西,请不要使用关系型数据库。 - Strawberry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接