我有一个允许用户加入多个群组的网络应用程序。
我有一个'用户'表,其中存储有关用户的详细信息(ID,电子邮件,密码等)和'groups'表,其中存储了有关可用组(ID,名称,组所有者)的详细信息。< / p>
我一直在研究存储组成员身份的最佳方式(即哪些用户在哪个组中,请记住他们可以是多个成员) - 但是我仍然不确定最有效的解决方案是什么。
你会推荐我: -
我使用的DBMS是phpMyAdmin。
答案 0 :(得分:2)
我肯定会选择选项1 - 创建联结表'group_memberships' - 我已经多次使用这种方法而没有问题。 不要忘记在新表'group_memberships'上为列添加索引:'groupID'和'userID'。
选项2无法针对大量数据进行扩展,尤其是在群组拥有大量用户的情况下。
<强>更新强>
有关索引的信息,这里有一个好的(和简短的)博客:https://blog.viaduct.io/mysql-indexes-primer/。
答案 1 :(得分:2)
我建议你选择1;你有一个映射表连接用户和&amp;基团。
用户表将在User_ID上具有PK。 Groups表将在Group_ID上具有PK。 Mapping表将具有User_ID(FK)和Group_ID(FK)。 现在你应该把这两个列放在一起PK。 这将确保您没有重复的条目。
答案 2 :(得分:1)
您所描述的内容在数据库术语中称为多对多关系。用户可以属于多个组,并且组具有多个用户(否则他们不会是&#34;组&#34;!)。
您的第一个想法,即group_memberships
表,是建立此关系的最佳方式。虽然您希望将其命名为users_groups
或类似内容,以反映关联或关联这两个表的事实。最基本的是,这个关联表需要三列:
通过在user_id或group_id上加入此表,您可以从关系的任一侧找到相关记录。您可以从SQL查询中直接执行此操作,而无需存储阵列时需要的任何其他代码。
答案 3 :(得分:0)
第一种选择是正确的选择。实际上它是用户表和组表的物化视图。
将物化视图视为额外的表或冗余数据结构,将用户属性和组属性非规范化,以便快速搜索。
因为如果我们没有视图,当我们查询组ID以列出其所有用户时,我们必须过滤数百万用户以检查他/她是否在特定组中。这是一场表演噩梦!
Mysql具有非常有效地构建此视图的工具。您可以在此视图列上构建二级索引,以便快速搜索,例如,组ID,组名,用户ID,用户名或您希望搜索的其他内容。
祝你好运:-)