在多个表之间的数据库中建立关系

时间:2016-04-11 21:48:57

标签: mysql sql database database-design relational-database

我有一个允许用户加入多个群组的网络应用程序。

我有一个'用户'表,其中存储有关用户的详细信息(ID,电子邮件,密码等)和'groups'表,其中存储了有关可用组(ID,名称,组所有者)的详细信息。< / p>

我一直在研究存储组成员身份的最佳方式(即哪些用户在哪个组中,请记住他们可以是多个成员) - 但是我仍然不确定最有效的解决方案是什么。

你会推荐我: -

  • 创建第二个名为“group_memberships”的表,并将用户的ID与相应的组ID一起存储?
  • 使用其成员的用户ID将数组与“组”表中的组详细信息一起存储?
  • 以不同的方式处理此任务?

我使用的DBMS是phpMyAdmin。

4 个答案:

答案 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或类似内容,以反映关联关联这两个表的事实。最基本的是,这个关联表需要三列:

  1. ID(主键)
  2. user_id(外键)
  3. group_id(外键)
  4. 通过在user_id或group_id上加入此表,您可以从关系的任一侧找到相关记录。您可以从SQL查询中直接执行此操作,而无需存储阵列时需要的任何其他代码。

答案 3 :(得分:0)

第一种选择是正确的选择。实际上它是用户表和组表的物化视图。

将物化视图视为额外的表或冗余数据结构,将用户属性和组属性非规范化,以便快速搜索。

因为如果我们没有视图,当我们查询组ID以列出其所有用户时,我们必须过滤数百万用户以检查他/她是否在特定组中。这是一场表演噩梦!

Mysql具有非常有效地构建此视图的工具。您可以在此视图列上构建二级索引,以便快速搜索,例如,组ID,组名,用户ID,用户名或您希望搜索的其他内容。

祝你好运:-)