【问题标题】:How to create user/group associations in MySQL如何在 MySQL 中创建用户/组关联
【发布时间】:2013-02-17 15:19:45
【问题描述】:

我正在使用 PHP/MySQL 开发一个 webapp,我已经到了需要创建用户/组关联的地步。

这是我的目标:

  • 我将拥有越来越多的组和用户。

  • 用户将能够修改他们的组关联
    随时随地。

  • 组关联将决定内容的优先级
    显示在网站上。

  • 发送给用户的电子邮件更新将由他们当前的组决定 协会。

我的问题是,处理这种用户/组关联的最佳方式是什么?

我目前的表结构是这样的(为便于交流而简化):

Users:
User_ID, User_name, Fname, Lname, is_dealer

Deals:
Deal_ID, Dealer_ID, Deal_name, Deal_content

Dealers:
Dealer_ID, User_ID, Dealer_name, Dealer address.. etc.

我最初的想法是创建一个包含 Group_ID 和 Group_name 列的 Groups 表。然后我可以做以下两件事之一:

我可以在 Groups 表中创建一个名为“User_ID”的列,并且对于每个组关联,我都有一行说明 Group_ID、Group_name 和 User_ID。这个选项感觉就像它会创建一个巨大的超级冗余数据库表。

我能想到的另一个选项是在 Users 表中创建一个 Group_ID 列,并在必须解析的某种文本数组中填充与用户关联的所有组。这里的问题是我希望有无限数量的组,并且为我的用户表中的每一行将所有用户的组关联塞入一个“值”似乎超级草率。

这确实是一个 SQL 数据库逻辑/设计问题。 任何帮助都会有很大帮助。

谢谢!

【问题讨论】:

  • 如果您愿意,我们可以将此问题迁移到我们的 DBA 姊妹站点:dba.stackexchange.com。如果这是有利的,则标记要迁移的 mod。

标签: mysql sql database-design relational-database


【解决方案1】:

你必须创建一个交叉表。

保持您的用户不变并创建以下两个表:

Groups:
Group_ID, Group_name

Groups_Users:
Group_ID, User_ID

这是典型的 n:m 关系,没有冗余数据。

【讨论】:

  • 我同意你的观点,但他也应该对外键使用参照完整性。
【解决方案2】:

只需制作一个将用户与组相关联的表格。两列:一列存储唯一的 user_id,另一列存储唯一的 group_id。

如果您使 user_id-group_id 组合唯一,则此表中不需要唯一键。两列就足够了。

+---------+      +------------+
| user    |      | user2group |     +----------+
+---------+      +------------+     | group    |
| user_id |----->| user_id    |     +----------+
| name    |      | group_id   |<----| group_id |
| pass    |      +------------+     | name     | 
| ...     |                         | ...      |
+---------+                         +----------+

如果我没记错的话,这是标准化的三个步骤之一。也许你应该看看这个。

【讨论】:

  • 完美。非常感谢!现在你这么说似乎很明显,但由于某种原因我无法弄清楚。非常感谢。
  • @AbuDun 那么group 表真的存在吗? user2group 表中的group_id 也可以引用user 表中的user_id
  • @timpeterson 这就是您在像 MySQL 这样的 RDBMS 中创建多对多关系的方式。 user2group 中的 group_iduser_id 是它们各自表的“外键”。删除任一“父行”也会删除user2group“子行”。
【解决方案3】:

我认为将用户链接到 GROUPS 表

您必须创建名为 u_g_realationship 的第三个表

表结构

id    user_id    group_id
--    -------    --------
1     2          7
2     2          5

与将关系塞在一个列中相比,这将使更新或删除关系变得非常容易

我希望这能解决你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 2017-08-02
    • 2012-03-19
    • 2017-04-05
    • 2019-09-30
    • 1970-01-01
    • 2022-12-08
    • 2021-01-22
    相关资源
    最近更新 更多