0

假设我通过以下方式使用类表继承:

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 的存在以找到它的子类型,这将是非常低效的。我需要一种可以使用单个字段来确定子类型的方法。任何人都可以帮忙吗?

4

1 回答 1

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”。

您应该声明“员工”和“志愿者”的主键。

您的设计中没有任何内容可以防止同一个人同时作为员工和志愿者进入。那可能不是你想要的。

于 2013-03-30T22:02:44.393 回答