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

Mysql 在数据库中建立多个表之间的关系,mysql,sql,database,database-design,relational-database,Mysql,Sql,Database,Database Design,Relational Database,我有一个web应用程序,允许用户加入多个组 我有一个“用户”表,用于存储有关用户的详细信息(id、电子邮件、密码等),还有一个“组”表,用于存储有关可用组的详细信息(id、名称、组所有者) 我一直在研究存储组成员身份的最佳方法(即,哪些用户在哪个组中,记住他们可以是多个组的成员)-但是我仍然不确定最有效的解决方案是什么 你能推荐我:- 创建第二个名为“group_memberships”的表,并将用户ID与相应的组ID一起存储 在“groups”表中的组详细信息旁边存储一个数组,其中包含其成员

我有一个web应用程序,允许用户加入多个组

我有一个“用户”表,用于存储有关用户的详细信息(id、电子邮件、密码等),还有一个“组”表,用于存储有关可用组的详细信息(id、名称、组所有者)

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

你能推荐我:-

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

我使用的DBMS是phpMyAdmin。

我肯定会选择选项1——创建连接表“组成员身份”——我多次使用这种方法,没有遇到任何问题不要忘记在新表“group_memberships”中为列“groupID”和“userID”添加索引

对于大量数据,选项2是不可伸缩的,尤其是当组有大量用户时

更新:


关于索引的信息,这里有一个好的(简短的)博客:

我肯定会选择选项1——创建连接表“group_memberships”——我多次使用这种方法,没有遇到任何问题不要忘记在新表“group_memberships”中为列“groupID”和“userID”添加索引

对于大量数据,选项2是不可伸缩的,尤其是当组有大量用户时

更新:


关于索引的信息,这里有一个好的(简短的)博客:

我建议您选择选项1;其中有一个用于链接用户和组的映射表

用户表将在用户ID上具有PK。 Groups表将在Group_ID上具有PK。 映射表将具有用户ID(FK)和组ID(FK)。 现在,这两列上的PK应该在一起。
这将确保您没有重复的条目。

我建议您选择选项1;其中有一个用于链接用户和组的映射表

用户表将在用户ID上具有PK。 Groups表将在Group_ID上具有PK。 映射表将具有用户ID(FK)和组ID(FK)。 现在,这两列上的PK应该在一起。
这将确保您没有重复的条目。

您所描述的在数据库术语中称为多对多关系。一个用户可以属于多个组,并且组中有多个用户(否则它们就不是“组”!)

您的第一个想法是
group\u memberships
表,它是公认的建立这种关系的最佳方式。尽管您希望将其命名为
users\u groups
或类似名称,以反映它与这两个表相关或关联的事实。最基本的情况是,此关联表需要三列:

  • ID(主键)
  • 用户id(外键)
  • 组id(外键)

  • 通过以用户id或组id连接到此表,您可以从关系的任何一方找到相关记录。您可以直接从SQL查询执行此操作,而无需任何其他代码(如存储数组所需)。

    您所描述的在数据库术语中称为多对多关系。一个用户可以属于多个组,并且组中有多个用户(否则它们就不是“组”!)

    您的第一个想法是
    group\u memberships
    表,它是公认的建立这种关系的最佳方式。尽管您希望将其命名为
    users\u groups
    或类似名称,以反映它与这两个表相关或关联的事实。最基本的情况是,此关联表需要三列:

  • ID(主键)
  • 用户id(外键)
  • 组id(外键)

  • 通过以用户id或组id连接到此表,您可以从关系的任何一方找到相关记录。您可以从SQL查询中正确地执行此操作,而无需任何额外的代码,就像存储数组时所需的代码一样。

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

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

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

    Mysql有很多工具可以非常高效地构建这个视图。您可以在此视图列上建立二级索引以进行快速搜索,例如,组id、组名称、用户id、用户名或其他您希望搜索的内容


    祝你好运:-)

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

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

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

    Mysql有很多工具可以非常高效地构建这个视图。您可以在此视图列上建立二级索引以进行快速搜索,例如,组id、组名称、用户id、用户名或其他您希望搜索的内容


    祝您好运:-)

    第一种方法是在关系数据库中存储此类列表的公认方法。第一种方法是在关系数据库中存储此类列表的公认方法。它被称为“连接表”。我知道我离题了