如何在SQL中实现聚合? (这不是关于GroupBy)

时间:2018-01-19 20:24:38

标签: mysql mysql-workbench entity-relationship aggregation

在大学项目的范围内,我应该实现我的数据库的聚合 我给出了一个实体关系模型,它看起来与此类似: Example for an Aggregation as a Entity-Relationship model 现在我应该实现一个创建这样的数据库的SQL脚本,但我在谷歌或其他任何地方找不到关于这个主题的任何内容。在我的教授的幻灯片中说它

  
      
  • 例如,要表示关系works_on和实体集管理器之间的聚合管理,请创建架构
      manage(employee_id,branch_name,title,manager_name)
  •   
  • 如果我们愿意在架构管理中存储属性manager_name的空值,那么Schema works_on是多余的
  •   

所以我试着把两个表放到我的SQL脚本中,一个叫works-on,一个叫manages。在works-on中,我放置了jobbranchemployee的所有主键,并将它们定义为外键。在manages中,我放了所有这些主键,另外我放了manager。现在的问题是,当我使用MySQL工作台的逆向工程师创建数据库的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);

2 个答案:

答案 0 :(得分:1)

您的ER-Diagram缺少一个重要信息:经理与新实体之间的基数,该实体是从其他4个元素构建的jobemployeemanager,{{ 1}}和branch(这个新实体用它们周围的方块标记)。

从幻灯片上的引文我们可以推断它是works-on - 关系, 这意味着0..1jobbranch(或employee中的每个条目)的每个组合最多只有一个works-on,但不需要一个{in与例如组合)相反。

但是你必须在实际任务中验证基数。

您通常可以通过多种方式实现ER图,但幻灯片意味着以下实现:

manager

我省略了表CREATE TABLE manages ( jobid INT not null, branchid INT not null, employeeid INT not null, managerid INT null, PRIMARY KEY (jobid, branchid, empoyeeid) ); jobemployeemanager的简单外键。

通过此实现,您不再拥有branch - 关系的显式表,就像幻灯片中的第二个语句所说的那样。它包含在works-on表中。这只能用于manages - 关系,这就是为什么基数可以被推销的原因。

如果您想保留0..1的表格,请使用

works-on

同样,我省略了普通的外键。

为了简化外键(并且可能强调组合被视为新实体),您可以像@Barmar建议的那样,在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) ); - 表中添加一个额外的(通常是自动增量)键。并在works_on表中使用此值,但幻灯片不会在此处执行此操作。

如果您需要实施manages - 关系(多位经理可以管理特定的0..n - 组合),则无法吸收works-on中的works-on - 关系} - 再关系(所以你需要两个表),并尊重manages,你必须在主键n中加入managerid(但仍然需要保留{ {1}})。

答案 1 :(得分:0)

您需要为works_on表提供主键,然后在manages表中引用该主键,而不是引用employeejob和{{ 1}}直接。

branch