我可以使用多个外键,它们的值来自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没有返回任何行,那么这仅仅意味着您正在搜索的用户没有该功能。