我正在开发一个处理员工信息的数据库项目。员工的专业是女佣、司机、保安。我决定为每个具有所有本地和继承属性的实体集建立一个架构。由于专业化是完全的,我将广义实体集“员工”定义为包含专业化关系并集的“视图”关系。我遇到的问题是尝试为员工电话号码创建另一个表,该表使用 emp_number 作为外键并使用 (emp_number,phone_number) 作为主键。
这是我到目前为止所做的:
CREATE TABLE maid(
emp_number CHAR(8) PRIMARY KEY,
emp_name VARCHAR(2),
address VARCHAR(50),
birthday DATE
experience_year INT);
CREATE TABLE driver(
emp_number CHAR(8) PRIMARY KEY,
emp_name VARCHAR(2),
address VARCHAR(50),
birthday DATE
license_number CHAR(6));
CREATE TABLE maid(
emp_number CHAR(8) PRIMARY KEY,
emp_name VARCHAR(2),
address VARCHAR(50),
birthday DATE
gun_license CHAR(6));
//定义具有通用属性的员工视图
CREATE VIEW employee AS
SELECT
emp_number,
emp_name,
address,
birthday,
TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS age,
'maid' AS employee_type
FROM
maid
UNION ALL
SELECT
emp_number,
emp_name,
address,
birthday,
TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS age,
'driver' AS employee_type
FROM
driver
UNION ALL
SELECT
emp_number,
emp_name,
address,
birthday,
TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS age,
'security_guard' AS employee_type
FROM
security_guard;
我尝试使用员工视图来创建表:
CREATE TABLE emp_phone (
emp_number CHAR(8)NOT NULL,
emp_phone CHAR(11) NOT NULL,
number_type VARCHAR(10),
PRIMARY KEY (emp_number, emp_phone),
FOREIGN KEY (emp_number) REFERENCES employee(emp_number)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB;
但是,它给了我一个错误“外键约束格式不正确。经过研究,我意识到你不能引用视图表。
对于员工的所有专业,是否有更好的方法来引用“emp_number”?
您正在混合超类型-子类型建模的数据库设计策略,这会导致问题。
首先,您决定为 3 个子类型创建完全独立的表,即使它们的 5 列中有 4 列是相同的。
突然,您想要将所有 3 个实体的电话号码存储在一个公用表中。这是不同的设计策略。这两种策略都可以满足您的目的,但混合使用它们并不是一个好主意。
按照您当前的设计策略,将电话号码作为单独的列添加到三个子类型表中。
或者,选择不同的设计策略,然后从头开始重新设计当前的结构。