【问题标题】:SQL Workbench to reverse engineer database - making too many connectionsSQL Workbench 对数据库进行逆向工程 - 建立太多连接
【发布时间】:2017-03-20 22:21:51
【问题描述】:

我创建了一个数据库,这里提供了代码。外键是在创建后使用 Alter Table 命令定义的。

在逆向工程和查看 EER 图时,一些表由多条关系线连接 - 有没有办法简单地将连接更改为描绘 1-1、1-M 关系的一条线?

EER 链接在底部。

DROP DATABASE IF EXISTS DasBus;

CREATE DATABASE DasBus;
use DasBus;

BEGIN;

CREATE TABLE Path (
  PATH_NUM VARCHAR(10) PRIMARY KEY,
  START_POINT VARCHAR(10) NOT NULL,
  END_POINT VARCHAR(10) NOT NULL,
  INTER DECIMAL(8,2) NOT NULL,
  TOT_DURATION TIME NOT NULL,
  PATH_DELAY_NUM VARCHAR(10) NOT NULL,
  BUS_NUM VARCHAR(10) NOT NULL,
  PATH_STOP_NUM VARCHAR(10) NOT NULL,
  SCHED_NUM VARCHAR(10) not null
);

CREATE TABLE Path_Delay (
  PATH_DELAY_NUM VARCHAR(10) PRIMARY KEY,
  ISDELAYED BOOLEAN NOT NULL DEFAULT 0,
  PATH_NUM VARCHAR(10) NOT NULL,
  DELAY_NUM VARCHAR(10) NOT NULL
);

CREATE TABLE Delay (
  DELAY_NUM VARCHAR(10) PRIMARY KEY,
  DELAY_TIME INTEGER NOT NULL DEFAULT 0,
  DESCRIPTION VARCHAR(100) NOT NULL,
  PATH_DELAY_NUM VARCHAR(10) NOT NULL
);

CREATE TABLE Path_Stop (
  PATH_STOP_NUM VARCHAR(10) PRIMARY KEY,
  PATH_NUM VARCHAR(10) NOT NULL,
  STOP_NUM VARCHAR(10) NOT NULL,
  TIMEBETWEEN INTEGER NOT NULL
);

CREATE TABLE BusStop (
  STOP_NUM VARCHAR(10) PRIMARY KEY,
  STOP_NAME VARCHAR(100) NOT NULL,
  ISACTIVE BOOLEAN NOT NULL DEFAULT 1,
  STOPCONDITION VARCHAR(100) NOT NULL,
  PATH_STOP_NUM VARCHAR(10) NOT NULL,
  SCHED_NUM VARCHAR(10) not null
);

CREATE TABLE BusSchedule (
  SCHED_NUM VARCHAR(10) PRIMARY KEY,
  INTER TIME NOT NULL,
  START_TIME TIME NOT NULL,
  END_TIME TIME NOT NULL,
  PATH_NUM VARCHAR(10) NOT NULL,
  STOP_NUM VARCHAR(10) NOT NULL
);

CREATE TABLE Bus (
  BUS_NUM VARCHAR(10) PRIMARY KEY,
  BUS_CAPACITY INTEGER(4),
  DRIVER_NUM VARCHAR(10) NOT NULL,
  PATH_NUM VARCHAR(10) NOT NULL
);

CREATE TABLE Driver (
  DRIVER_NUM VARCHAR(10) PRIMARY KEY,
  DRIVER_LNAME VARCHAR(25) NOT NULL,
  DRIVER_FNAME VARCHAR(25) NOT NULL,
  DRIVER_STREET VARCHAR(25) NOT NULL,
  DRIVER_CITY VARCHAR(25) NOT NULL,
  DRIVER_ZIP CHAR(6),
  DRIVER_PHONE VARCHAR(15),
  BUS_NUM VARCHAR(10) NOT NULL
);

<p>ALTER TABLE PATH ADD CONSTRAINT Path1 FOREIGN KEY (BUS_NUM) REFERENCES Bus(BUS_NUM);
<p>ALTER TABLE PATH ADD CONSTRAINT Path2 FOREIGN KEY (PATH_DELAY_NUM) REFERENCES Path_Delay (PATH_DELAY_NUM);
<p>ALTER TABLE PATH ADD CONSTRAINT Path3 FOREIGN KEY (PATH_STOP_NUM) REFERENCES Path_Stop(PATH_STOP_NUM);
<p>ALTER TABLE PATH ADD CONSTRAINT Path4 FOREIGN KEY (SCHED_NUM) REFERENCES BusSchedule(SCHED_NUM);
<p>ALTER TABLE Path_Delay ADD CONSTRAINT Path_Delay1 FOREIGN KEY (PATH_NUM) REFERENCES Path(PATH_NUM);
<p>ALTER TABLE Path_Delay ADD CONSTRAINT Path_Delay2 FOREIGN KEY (DELAY_NUM) REFERENCES Delay(DELAY_NUM);
<p>ALTER TABLE DELAY ADD CONSTRAINT Delay1 FOREIGN KEY (PATH_DELAY_NUM) REFERENCES Path_Delay(PATH_DELAY_NUM);
<p>ALTER TABLE BusStop ADD CONSTRAINT BusStop1 FOREIGN KEY (PATH_STOP_NUM) REFERENCES Path_Stop(PATH_STOP_NUM);
<p>ALTER TABLE BusStop ADD CONSTRAINT BusStop2 FOREIGN KEY (SCHED_NUM) REFERENCES BusSchedule(SCHED_NUM);
<p>ALTER TABLE BUS ADD CONSTRAINT Bus1 FOREIGN KEY (DRIVER_NUM) REFERENCES Driver(DRIVER_NUM);
<p>ALTER TABLE BUS ADD CONSTRAINT Bus2 FOREIGN KEY (PATH_NUM) REFERENCES Path(PATH_NUM);
<p>ALTER TABLE DRIVER ADD CONSTRAINT Driver1 FOREIGN KEY (BUS_NUM) REFERENCES Bus(BUS_NUM);
<p>ALTER TABLE Path_Stop ADD CONSTRAINT Path_Stop1 FOREIGN KEY (PATH_NUM) REFERENCES Path(PATH_NUM);
<p>ALTER TABLE Path_Stop ADD CONSTRAINT Path_Stop2 FOREIGN KEY (STOP_NUM) REFERENCES BusStop(STOP_NUM);
<p>ALTER TABLE BusSchedule ADD CONSTRAINT BusSchedule1 FOREIGN KEY (STOP_NUM) REFERENCES BusStop (STOP_NUM);
<p>ALTER TABLE BusSchedule ADD CONSTRAINT BusSchedule2 FOREIGN KEY (PATH_NUM) REFERENCES Path (PATH_NUM);

EER 图:

【问题讨论】:

  • 该图不是 ERD,而是表格图。此外,FK 约束不是 ER 关系。关系由表中的两个或多个实体键表示,例如(BUS_NUM, DRIVER_NUM)bus 表中。 FK 约束强制执行逻辑域,它们不用于关联 ER 模型中的事物。

标签: mysql sql mysql-workbench erd


【解决方案1】:

连接您的表的线源自您的表上定义的外键。如果你想减少它们的数量,那么你需要减少外键的数量。

由于您的所有表至少由 2 行连接,我想说您一般不完全理解外键和建立关系。我们以busdriver 表为例。

外键交叉引用 2 个表。您可能想用这种方式表达n:m 关系,表示单个驱动程序可能驱动多个总线,但单个总线可能由多个驱动程序驱动。

实现这种关系的正确方法是引入第三个表(我们称之为bus_drivers),其中至少包含busdrivers 表中的主键。这样的表称为associative table

您需要重新访问所有外键和表并对其进行修改,直到生成的图表符合您的期望。如果您有这么多 n:m 关系,您可能需要添加很多关联表。

在基于外键的关系的初始映射之后,您可以在 mysql 工作台的relationship editor 中修改关系的可见性和基数。

【讨论】:

  • 当您使用 n:m 工具时,MySQL Workbench 甚至会自动创建关联表。
猜你喜欢
  • 1970-01-01
  • 2014-07-19
  • 2012-10-09
  • 2022-01-20
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
相关资源
最近更新 更多