【问题标题】:Establishing relationships in a database between multiple tables在数据库中建立多个表之间的关系
【发布时间】:2016-08-02 06:39:04
【问题描述】:

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

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

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

你会推荐我吗:-

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

我使用的 DBMS 是 phpMyAdmin。

【问题讨论】:

  • 第一种方法是将此类列表存储在关系数据库中的公认方法。它被称为“连接表”。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我肯定会选择选项 1 - 创建联结表 'group_memberships' - 我已经多次使用这种方法而没有问题。 不要忘记在新表 'group_memberships' 上为以下列添加索引:'groupID' 和 'userID'。

    对于大量数据,选项 2 不可扩展,尤其是在组有大量用户的情况下。

    更新:

    有关索引的信息,这里有一个很好(而且很短)的博客:https://blog.viaduct.io/mysql-indexes-primer/

    【讨论】:

    • 我知道我有点离题了,但是什么是索引以及它如何影响关系?
    • 没问题 - 我已经更新了我的答案,包括一个指向解释索引的博客的链接。 (如果您的问题已得到解答,则应将其中一个答案标记为已解决)
    【解决方案3】:

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

    您的第一个想法,group_memberships 表,是公认的建模这种关系的最佳方式。尽管您希望将其命名为 users_groups 或类似名称,以反映它关联关联这两个表的事实。最基本的,这个关联表需要三列:

    1. ID(主键)
    2. user_id(外键)
    3. group_id(外键)

    通过在 user_id 或 group_id 上加入此表,您可以从关系的任一方找到相关记录。而且您可以直接从 SQL 查询中执行此操作,而无需像存储数组那样需要任何额外的代码。

    【讨论】:

      【解决方案4】:

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

      只需将物化视图视为一个额外的表或冗余数据结构,它将用户属性和组属性非规范化在一起以进行快速搜索。

      由于如果我们没有视图,当我们查询组 id 以列出其所有用户时,我们必须过滤数百万用户以检查他/她是否在某个组中。这是一场性能噩梦!

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

      祝你好运:-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-13
        • 2011-01-19
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        相关资源
        最近更新 更多