我有一个表名permission
。在这张表中,我有两列。这两个列名称为student
和teacher
。这两个是外键。他们的参考值来自user
表。
我想要做的是,如果用户ID存在student
列,则该用户将能够完成与学生相关的一些工作。而且,如果teacher
列中存在用户ID,那么他将能够完成与教师相关的工作。
所以那两列都是外键。这两个值来自user
表。用户ID可以存在于两列中。所以我的问题是我可以使用两个外键,其值来自同一个表吗?
或者我应该创建一个名为user_id
的新列作为外键,然后如果该student
或teacher
列值为1
,则表示该学生已拥有允许执行一些允许的工作。如果该用户的student
或teacher
列的值为0
,则表示该用户没有权限。
答案 0 :(得分:1)
我希望您的第二个语句只有一列外键,但是另外两列可以区分它是学生还是教师,或者两者都是如此,因此每个user_id
都不会有重复的行。< / p>
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 |
+---------+------------+------------+
或者它可能是一列供其许可:
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 | privilege |
+---------+-----------+
| 001 | 1 |
+---------+-----------+
| 002 | 2 |
+---------+-----------+
| 003 | 3 |
+---------+-----------+