如何在sql中实现聚合(这与groupby无关)

isr3a4wc  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(445)

在大学项目的范围内,我应该实现数据库的聚合。
我得到了一个实体关系模型,它看起来类似于:

现在我应该实现一个sql脚本来创建这样一个数据库,但是我在google或其他任何地方都找不到关于这个主题的任何东西。我教授的幻灯片上写着
例如,要表示works和entity set manager之间的聚合管理,请创建一个模式
管理(员工id、分支机构名称、职务、经理名称)
schema works\u on是多余的,前提是我们愿意为schema manages上的属性管理器\u name存储空值
所以我试着把两个表放到我的sql脚本中,一个叫做 works-on 其中一个打电话来 manages . 在 works-on 我把所有的主键 job , branch 以及 employee 并将它们定义为外键。在 manages 我把所有这些主键 manager . 现在的问题是,当我使用mysql workbench的反向工程来创建数据库的eer模型时,我没有从中得到任何与此聚合有关的东西。我做错什么了?
按照@barmar的要求,我刚刚写了 CREATE TABLE -我会用这些语句:

CREATE TABLE job
(jobid INT,
PRIMARY KEY(jobid));

CREATE TABLE employee
(employeeid INT,
PRIMARY KEY(employeeid));

CREATE TABLE branch
(branchid INT,
PRIMARY KEY(branchid));

CREATE TABLE manager
(managerid INT,
PRIMARY KEY(managerid));

CREATE TABLE works_on
(jobid INT, KEY(jobid),
branchid INT, KEY(branchid),
employeeid INT, KEY(employeeid));

CREATE TABLE manages
(jobid INT, KEY(jobid),
branchid INT, KEY(branchid),
employeeid INT, KEY(employeeid),
managerid INT, KEY(managerid));

ALTER TABLE works_on
ADD CONSTRAINT FK_workson_employee FOREIGN KEY(employeeid) REFERENCES employee(employeeid);
ALTER TABLE works_on
ADD CONSTRAINT FK_workson_branch FOREIGN KEY(branchid) REFERENCES branch(branchid);
ALTER TABLE works_on
ADD CONSTRAINT FK_workson_job FOREIGN KEY(jobid) REFERENCES job(jobid);

ALTER TABLE manages
ADD CONSTRAINT FK_manages_employee FOREIGN KEY(employeeid) REFERENCES employee(employeeid);
ALTER TABLE manages
ADD CONSTRAINT FK_manages_branch FOREIGN KEY(branchid) REFERENCES branch(branchid);
ALTER TABLE manages
ADD CONSTRAINT FK_manages_job FOREIGN KEY(jobid) REFERENCES job(jobid);
ALTER TABLE manages
ADD CONSTRAINT FK_manages_manager FOREIGN KEY(managerid) REFERENCES job(managerid);
os8fio9y

os8fio9y1#

您需要为 works_on 表,然后在 manages 表,而不是引用 employee , job ,和 branch 直接。

CREATE TABLE works_on (
    works_on_id INT PRIMARY KEY,
    jobid INT,
    branchid INT,
    employeeid INT,
    CONSTRAINT jobid FOREIGN KEY REFERENCES job(jobid),
    CONSTRAINT branchid FOREIGN KEY REFERENCES brahc(branchid),
    CONSTRAINT employeeid FOREIGN KEY REFERENCES employee(employeeid)

);
CREATE TABLE manages (
    managerid INT,
    works_on_id INT,
    CONSTRAINT managerid FOREIGN KEY REFERENCES manager(id),
    CONSTRAINT works_on_id FOREIGN KEY REFERENCES works_on(id)
)
efzxgjgh

efzxgjgh2#

er图缺少一个重要信息:管理器和从其他4个元素构建的新实体之间的基数 job , employee , manager , branch 以及 works-on (这个新实体由它们周围的正方形标记)。
从幻灯片上的引语我们可以推断这是一个 0..1 -关系,这意味着 job , branch 以及 employee (或 works-on )最多有一个 manager ,但不需要(与构图相反)。
但是你必须在你的实际任务中验证这个基数。
通常可以通过几种方式实现er图,但幻灯片暗示了以下实现:

CREATE TABLE manages
( jobid INT not null,
  branchid INT not null,
  employeeid INT not null,
  managerid INT null,
  PRIMARY KEY (jobid, branchid, empoyeeid)
);

我省略了表中那些无关紧要的外键 job , employee , manager 以及 branch .
在这个实现中,您没有用于 works-on -就像幻灯片中的第二句话所说的那样。它包含在 manages table。那只对一个 0..1 -关系,这就是为什么基数是可以推断的。
如果你想给我留张table works-on ,您将使用

CREATE TABLE works_on
( jobid INT not null,
  branchid INT not null,
  employeeid INT not null,
  PRIMARY KEY (jobid, branchid, empoyeeid)
);

CREATE TABLE manages
( jobid INT not null,
  branchid INT not null,
  employeeid INT not null,
  managerid INT not null,
  PRIMARY KEY (jobid, branchid, empoyeeid),
  FOREIGN KEY (jobid, branchid, employeeid) 
    REFERENCES works_on (jobid, branchid, employeeid)
);

同样,我忽略了琐碎的外键。
为了简化外键(也许是为了强调组合被认为是一个新的实体),您可以像@barmar建议的那样,向 works_on -并在 manages -表,尽管幻灯片在这里不这样做。
如果你需要实施 0..n -关系(几个经理可以管理一个特定的 works-on -组合),你不能吸收 works-on -关系 manages -关系(所以您需要两个表),并尊重 n ,则必须包括 managerid 在主键中, PRIMARY KEY (jobid, branchid, empoyeeid, managerid) (但仍需保留 FOREIGN KEY (jobid, branchid, employeeid) ).

相关问题