【问题标题】:ER diagram - Are the relations and cardinalities correct?ER 图 - 关系和基数是否正确?
【发布时间】:2019-06-29 21:19:49
【问题描述】:

我正在 LucidChart 上为一家在 1 个地点销售和生产啤酒的啤酒厂构建图表。我观看了一些有关如何设计 ER 模型的视频。想知道这是正确的还是我犯了任何错误。在谈论 ER 模型时,“映射”到底是什么?

这是我的 ER 模型:

还有我从 LucidChart 离开的 Cardinality Legend:

【问题讨论】:

  • 不要看一些视频,阅读出版的学术信息建模和数据库设计教科书。 (描述设计的产品手册不是关于如何设计的教科书/教程。) stanford.edu 有免费的在线课程。此外,除非您给出规范、假设和理由,否则我们无法告诉您什么是正确的。问一个关于你坚持的部分的具体问题。 PS 对文本使用文本,而不是图像/链接,包括表格(格式为代码)和 ERD(提供 DDL)。将图像用于无法以文本形式给出的内容或增强文本。 PS 在您阅读它的地方如何定义“映射”?

标签: postgresql database-design entity-relationship


【解决方案1】:

在谈到 ER 模型时,“映射”究竟是什么?

在数据模型的上下文中,术语“映射”是将数据模型转换为 SQL DDL 的过程的名称,该 DDL 可用于在 MySQL 等数据库管理系统中创建数据库模式, SQL Server、Oracle 等。

据我所知,您无法使用 Visio 和 LucidChart 等工具“映射”,因为这些工具不是为数据建模而设计的。它们旨在使绘制图表的过程机械化。 (一个合适的数据模型包含的不仅仅是图片)

例如,我使用您的 ER 图,使用免费的 NORMA 工具设计了一个对象-角色模型。下图显示:

  1. 对象-角色模型

  2. 逻辑模型(从对象-角色模型生成逻辑模型需要几毫秒。)

  3. 我从对象角色模型“映射”的 SQL DDL(将对象角色模型映射到 SQL DDL 需要几秒钟。)

我使用 SQL Server Management Studio,因此可以将 DDL 的 T-SQL 版本复制并粘贴到“新建查询”窗口中,并在几秒钟内生成数据库表。

这是对象-角色模型(分成页面)

这是逻辑模型(自动生成) 请注意,与您的模型不同,逻辑模型中只有一个“地址”表。

这是 MySQL 服务器的 SQL DDL(自动生成)

CREATE TABLE Brewery
(
    breweryNr INT NOT NULL,
    addressNr INT NOT NULL,
    breweryName CHAR(63) NOT NULL,
    CONSTRAINT Brewery_PK PRIMARY KEY(breweryNr)
);

CREATE TABLE Address
(
    addressNr INT NOT NULL,
    country CHAR(63) NOT NULL,
    street CHAR(63) NOT NULL,
    town CHAR(63) NOT NULL,
    zipCode CHAR(63) NOT NULL,
    CONSTRAINT Address_PK PRIMARY KEY(addressNr)
);

CREATE TABLE Beer
(
    beerType CHAR(63) NOT NULL,
    alcoholPercent INT NOT NULL,
    beerAmountLitres CHAR(63) NOT NULL,
    beerID CHAR(63) NOT NULL,
    beerPrice CHAR(63) NOT NULL,
    kegNr INT NOT NULL,
    CONSTRAINT Beer_PK PRIMARY KEY(beerType)
);

CREATE TABLE BreweryMakesBeer
(
    beerType CHAR(63) NOT NULL,
    breweryNr INT NOT NULL,
    CONSTRAINT BreweryMakesBeer_PK PRIMARY KEY(breweryNr, beerType)
);

CREATE TABLE Keg
(
    kegNr INT NOT NULL,
    kegState CHAR(63) NOT NULL,
    CONSTRAINT Keg_PK PRIMARY KEY(kegNr)
);

CREATE TABLE Employee
(
    employeeNr INT NOT NULL,
    addressNr INT NOT NULL,
    birthDate INT NOT NULL,
    breweryNr INT NOT NULL,
    firstName CHAR(63) NOT NULL,
    lastName CHAR(63) NOT NULL,
    salary DECIMAL(6,4) NOT NULL,
    SSN CHAR(63) NOT NULL,
    middleInt CHAR(63),
    CONSTRAINT Employee_PK PRIMARY KEY(employeeNr)
);

CREATE TABLE Distributor
(
    distributorNr INT NOT NULL,
    brewingIngredientNr INT NOT NULL,
    CONSTRAINT Distributor_PK PRIMARY KEY(distributorNr)
);

CREATE TABLE BrewingIngredient
(
    brewingIngredientNr INT NOT NULL,
    ingredientName CHAR(63) NOT NULL,
    CONSTRAINT BrewingIngredient_PK PRIMARY KEY(brewingIngredientNr)
);

CREATE TABLE IngredientSupplier
(
    ingredientSupplierNr INT NOT NULL,
    addressNr INT NOT NULL,
    CONSTRAINT IngredientSupplier_PK PRIMARY KEY(ingredientSupplierNr)
);

CREATE TABLE IngredientSupply
(
    brewingIngredientNr INT NOT NULL,
    ingredientSupplierNr INT NOT NULL,
    CONSTRAINT IngredientSupply_PK PRIMARY KEY(brewingIngredientNr, ingredientSupplierNr)
);

ALTER TABLE Brewery ADD CONSTRAINT Brewery_FK FOREIGN KEY (addressNr) REFERENCES Address (addressNr) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE Beer ADD CONSTRAINT Beer_FK FOREIGN KEY (kegNr) REFERENCES Keg (kegNr) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE BreweryMakesBeer ADD CONSTRAINT BreweryMakesBeer_FK1 FOREIGN KEY (breweryNr) REFERENCES Brewery (breweryNr) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE BreweryMakesBeer ADD CONSTRAINT BreweryMakesBeer_FK2 FOREIGN KEY (beerType) REFERENCES Beer (beerType) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE Employee ADD CONSTRAINT Employee_FK1 FOREIGN KEY (breweryNr) REFERENCES Brewery (breweryNr) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE Employee ADD CONSTRAINT Employee_FK2 FOREIGN KEY (addressNr) REFERENCES Address (addressNr) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE Distributor ADD CONSTRAINT Distributor_FK FOREIGN KEY (brewingIngredientNr) REFERENCES BrewingIngredient (brewingIngredientNr) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE IngredientSupplier ADD CONSTRAINT IngredientSupplier_FK FOREIGN KEY (addressNr) REFERENCES Address (addressNr) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE IngredientSupply ADD CONSTRAINT IngredientSupply_FK1 FOREIGN KEY (brewingIngredientNr) REFERENCES BrewingIngredient (brewingIngredientNr) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE IngredientSupply ADD CONSTRAINT IngredientSupply_FK2 FOREIGN KEY (ingredientSupplierNr) REFERENCES IngredientSupplier (ingredientSupplierNr) ON DELETE RESTRICT ON UPDATE RESTRICT;

【讨论】:

    猜你喜欢
    • 2016-02-29
    • 2013-08-24
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2017-10-29
    相关资源
    最近更新 更多