假设我以下列方式使用类表继承:
CREATE TABLE person
(
id INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
forename VARCHAR(30) NOT NULL,
surname VARCHAR(30) NOT NULL
);
CREATE TABLE employee
(
id INT(10) NOT NULL,
salary INT(10),
FOREIGN KEY (id) REFERENCES person (id)
);
CREATE TABLE volunteer
(
id INT(10) NOT NULL,
FOREIGN KEY (id) REFERENCES person (id)
);
好的,现在说我想查看我网站上的权限,即我需要检查一个人是员工还是志愿者。我可以将“人”中的外键放入“类型”表中,但肯定会引入问题,因为员工的子类型可能会更改为志愿者,而超类中的“类型”也需要更新。
如果没有这个,我将不得不在任一表中搜索id的存在,以找到其效率非常低的子类型。我需要一种方法,我可以使用单个字段来找出子类型。有人可以帮忙吗?
答案 0 :(得分:0)
最简单的方法是使用视图。
create view persons_all as (
select p.id, p.forename, p.surname, 'employee' as category
from person p
inner join employee e
on p.id = e.id
union all
select p.id, p.forename, p.surname, 'volunteer' as category
from person p
inner join volunteer v
on p.id = v.id
);
您可以考虑将员工的文本缩短为“E”,志愿者的文本缩短为“V”。
您应该声明“员工”和“志愿者”的主键。
您的设计中没有任何内容可以阻止同一个人同时成为员工和志愿者。 可能不符合您的意图。