如何在 MySQL 的不同表中使用专门化的主键作为外键? [重复]

问题描述 投票:0回答:1

我正在开发一个处理员工信息的数据库项目。员工的专业是女佣、司机、保安。我决定为每个具有所有本地和继承属性的实体集建立一个架构。由于专业化是完全的,我将广义实体集“员工”定义为包含专业化关系并集的“视图”关系。我遇到的问题是尝试为员工电话号码创建另一个表,该表使用 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”?

mysql database-design
1个回答
0
投票

您正在混合超类型-子类型建模的数据库设计策略,这会导致问题。

首先,您决定为 3 个子类型创建完全独立的表,即使它们的 5 列中有 4 列是相同的。

突然,您想要将所有 3 个实体的电话号码存储在一个公用表中。这是不同的设计策略。这两种策略都可以满足您的目的,但混合使用它们并不是一个好主意。

按照您当前的设计策略,将电话号码作为单独的列添加到三个子类型表中。

或者,选择不同的设计策略,然后从头开始重新设计当前的结构。

© www.soinside.com 2019 - 2024. All rights reserved.