我可以使用多个外键,它们的值来自MySql中的同一个表吗
我有一个表名我可以使用多个外键,它们的值来自MySql中的同一个表吗,mysql,sql,Mysql,Sql,我有一个表名权限。在这个表中我有两列。这两个列名是student和teacher。这两个是外键。它们的参考值来自用户表 我想做的是,如果存在一个用户id是student列,那么这个用户将能够做一些与学生相关的工作。而且,如果教师列中存在一个用户id,那么他将能够做一些与教师相关的工作 所以这两列是外键。这两个值来自user表。两列中都可以存在用户id。所以我的问题是,我可以使用两个外键,它们的值来自同一个表吗 或者我应该创建一个名为user\u id的新列作为外键,然后如果该用户的student
权限
。在这个表中我有两列。这两个列名是student
和teacher
。这两个是外键。它们的参考值来自用户
表
我想做的是,如果存在一个用户id是student
列,那么这个用户将能够做一些与学生相关的工作。而且,如果教师
列中存在一个用户id,那么他将能够做一些与教师相关的工作
所以这两列是外键。这两个值来自user
表。两列中都可以存在用户id。所以我的问题是,我可以使用两个外键,它们的值来自同一个表吗
或者我应该创建一个名为
user\u id
的新列作为外键,然后如果该用户的student
或teacher
列值为1
,则表示学生有权做一些允许的工作。如果该用户的student
或teacher
列值为0
表示用户没有权限。我希望您的第二个语句中外键只有一列,但有两个附加列来区分它是学生还是教师,或者两者都有,这样每个用户id
就不会有重复的行
CREATE TABLE permission
(
user_id INT,
is_student BIT,
is_teacher BIT,
-- other columns, if there is any
INDEX permission_user_id (user_id),
FOREIGN KEY (user_id) REFERENCES user(user_id)
)
示例行:
+---------+------------+------------+
| user_id | is_student | is_teacher |
+---------+------------+------------+
| 001 | 1 | 0 |
+---------+------------+------------+
| 002 | 0 | 1 |
+---------+------------+------------+
| 003 | 1 | 1 |
+---------+------------+------------+
+---------+-----------+
| user_id | privilege |
+---------+-----------+
| 001 | 1 |
+---------+-----------+
| 002 | 2 |
+---------+-----------+
| 003 | 3 |
+---------+-----------+
或者它可以是一列以获得其许可:
CREATE TABLE permission
(
user_id INT,
privilege tinyint, -- 1 for student, 2 for teacher, 3 for both
-- other columns, if there is any
INDEX permission_user_id (user_id),
FOREIGN KEY (user_id) REFERENCES user(user_id)
)
示例行:
+---------+------------+------------+
| user_id | is_student | is_teacher |
+---------+------------+------------+
| 001 | 1 | 0 |
+---------+------------+------------+
| 002 | 0 | 1 |
+---------+------------+------------+
| 003 | 1 | 1 |
+---------+------------+------------+
+---------+-----------+
| user_id | privilege |
+---------+-----------+
| 001 | 1 |
+---------+-----------+
| 002 | 2 |
+---------+-----------+
| 003 | 3 |
+---------+-----------+
我本打算这么做,但我的困惑是,如果我使用第二种方法,那么我必须运行
select user\u id,student,teacher from permission,其中user\u id=$user\u id`然后我必须检查该用户是否有权限。另一方面,如果我使用第一种方法,我可以这样做从权限中选择teacher,其中user\u id=$user\u id
,然后我将检查该列中是否存在该用户。我的意思是,如果我使用第一种方法,那么我就不必获取user\u id
列。我想这会节省一些速度。@Fokrule如果您想检查它是否是教师,它还是一样的,对于我的回答中的表结构1:从权限中选择user\u id,其中user\u id=$user\u id,is\u teacher=1
。与表结构2相同,从权限中选择user\u id,其中user\u id=$user\u id和privilege=2
。如果上面的任何sql没有返回任何行,那么这仅仅意味着您正在搜索的用户没有该功能。