如何(快速)确定“类表继承”关系数据库模型中的子类型?

时间:2013-03-30 21:08:56

标签: database relational-database

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

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的存在,以找到其效率非常低的子类型。我需要一种方法,我可以使用单个字段来找出子类型。有人可以帮忙吗?

1 个答案:

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

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

您的设计中没有任何内容可以阻止同一个人同时成为员工和志愿者。 可能不符合您的意图。