【问题标题】:Defining tables that related many-to-many using MySQL使用 MySQL 定义多对多关联的表
【发布时间】:2014-05-09 03:41:09
【问题描述】:

我有一个包含 3 个表、角色、部门和用户的数据库。我想要用户和部门之间的多对多关系,我想要用户和角色之间的多对多关系。使用 MySQL 定义多对多关系时使用了哪些技术?

【问题讨论】:

  • 外键是什么?
  • 如果您不知道如何设置,为什么要创建数据库?
  • @samitha 我认为它们都是外键,你不觉得吗?

标签: mysql database database-design many-to-many relational-database


【解决方案1】:

对于多对多连接,您需要为每对表创建一个查找表。

users (user_id, username, password)
roles (role_id, role_name)
department (department_id, name, location)
users_roles (user_id, role_id)
  - user_id is a foreign key to users.user_id
  - role_id is a foreign key to role.role_id
  - user_id,role_id should be a unique key
users_departments (user_id, department_id)
  - user_id is a foreign key to users.user_id
  - department_id is a foreign key to department.department_id
  - user_id,department_id should be a unique key

更新

在 cmets 中回答您的问题,您可以使用JOIN 组合表格并使用它们来获取数据。例如,要从给定部门(例如,department_id=1)和角色(例如,role_id=2)获取用户,您可以这样做:

SELECT `u`.*
FROM `users` AS `u`
    JOIN `users_roles` AS `ur` USING (`users_id`)
    JOIN `users_departments` AS `ud` USING (`users_id`)
WHERE `ur`.`role_id` = 2
    AND `ud`.`department_id` = 1

您可以在JOIN article on the MySQL developer site 中阅读有关如何使用联接的更多信息

【讨论】:

  • 感谢您的回答,但使用这种结构,我怎么知道部门 = 1 中的角色 = 1?
  • 抱歉,我没有看到这种结构的限制,这样一来,User=1 可以有 Role=1 和 Role=2,两者都在同一个部门,但只能有一个角色。
  • 您说“我想要用户和角色之间的多对多关系”。如果您需要用户和部门以及用户和角色之间的多对多关系,但对于一个部门的给定用户只需要一个角色,这是一个新的要求。在这种情况下,您需要一个包含(user_id,department_id,role_id)的组合查找表,并在(user_id,department_id)上有一个唯一键。但同样,请注意这两种情况之间的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2019-04-29
相关资源
最近更新 更多