ERD一表到多表关系

时间:2015-07-31 16:17:06

标签: database-design uml data-modeling erd

我正在创建一个ERD,某些部分让我很头疼。

我的问题: 我有四个实体:杂志,书籍,报纸和网页。 每个实体都有自己的属性。

我想对这四个来源中的每一个都做笔记。但是注意事项只能参考其中一个。例如。书上的注释,不能是杂志,报纸或网页上的注释。 此外,应该可以在杂志,书籍,报纸或网页上做多个笔记。

经过几天的反复试验,搜索网页和老式书籍后,我仍然找不到如何对此进行建模的方法。

我认为我需要使用N-ary协会,但我不确定。 有人可以帮我吗?该如何建模?

旁注:我正在使用Enterprise Architect进行建模。

编辑: 在思考问题并思考答案和评论时,我创建了这个ERD:

ERD

这感觉就像我需要的那样,但在这种情况下,我认为仍然可以将一张便条与一本杂志和一本书(以及一份报纸和一个网站)联系起来。那些AND应该是OR。

希望这可以澄清一些事情。希望我的多重性是正确的(我猜这太久了,我猜)。

2 个答案:

答案 0 :(得分:1)

一种方法是创建一个超类型(让我们称之为出版物),您可以在其上挂起您的笔记。我们可以包含互斥限制,以防止出版物发挥多个角色。

我意识到你问过如何建模但是我会给你SQL DDL而不是图表。我的建模工具不允许我正确设置杂志的外键。

CREATE TABLE publications (
    publication_id INT(11) AUTO_INCREMENT PRIMARY KEY,
    publication_type ENUM('M','B','N','W') NOT NULL,
    KEY id_type (publication_id, publication_type)
);

CREATE TABLE magazines (
    publication_id INT(11) NOT NULL PRIMARY KEY,
    publication_type ENUM('M') NOT NULL,
    FOREIGN KEY (publication_id, publication_type)
    REFERENCES publications (publication_id, publication_type)
    ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE notes (
    note_id INT(11) NOT NULL PRIMARY KEY,
    publication_id INT(11) NOT NULL,
    FOREIGN KEY (publication_id)
    REFERENCES publications (publication_id)
    ON DELETE CASCADE ON UPDATE CASCADE
);

枚举('M','B','N','W')用于区分杂志,书籍,报纸和网页。我没有显示最后三个表格,它们与杂志的架构类似。

关于实体关系术语的一些注释。首先,关系是实体之间(并存储在表中),而不是表之间的关系。其次,表具有列,而属性是实体和值之间的一对一关联,并由表中的列对表示。

编辑:

类似的技术,但在填充数据库后更容易实现,是创建一个新的实体类型作为注释的容器,并在需要时将它们合并到原始实体中。例如:

CREATE TABLE notables (
    notable_id INT(11) AUTO_INCREMENT PRIMARY KEY
);

CREATE TABLE magazines (
    magazine_id INT(11) NOT NULL PRIMARY KEY,
    notable_id INT(11) NULL,
    FOREIGN KEY (notable_id)
    REFERENCES notables (notable_id)
    ON DELETE SET NULL ON UPDATE CASCADE
);

CREATE TABLE notes (
    note_id INT(11) NOT NULL PRIMARY KEY,
    notable_id INT(11) NOT NULL,
    FOREIGN KEY (notable_id)
    REFERENCES notables (notable_id)
    ON DELETE CASCADE ON UPDATE CASCADE
);

在这种情况下,实施互斥不是那么容易,理论上可以重复使用notable_id。

答案 1 :(得分:0)

嗯。也许你把事情弄得太复杂了。如果所有票据仅属于单个实体,则它们显然只是该实体的属性。否则,没有理由让它们成为一个实体。

如果您真的需要一个Notes实体,您可以按照以下方式为您的要求建模: enter image description here

修改 OP的0..1多样性意味着0..n。但是,在任何其他方面,关系都不会改变。