我正在创建一个ERD,某些部分让我很头疼。
我的问题: 我有四个实体:杂志,书籍,报纸和网页。 每个实体都有自己的属性。
我想对这四个来源中的每一个都做笔记。但是注意事项只能参考其中一个。例如。书上的注释,不能是杂志,报纸或网页上的注释。 此外,应该可以在杂志,书籍,报纸或网页上做多个笔记。
经过几天的反复试验,搜索网页和老式书籍后,我仍然找不到如何对此进行建模的方法。
我认为我需要使用N-ary协会,但我不确定。 有人可以帮我吗?该如何建模?
旁注:我正在使用Enterprise Architect进行建模。
编辑: 在思考问题并思考答案和评论时,我创建了这个ERD:
这感觉就像我需要的那样,但在这种情况下,我认为仍然可以将一张便条与一本杂志和一本书(以及一份报纸和一个网站)联系起来。那些AND应该是OR。
希望这可以澄清一些事情。希望我的多重性是正确的(我猜这太久了,我猜)。
答案 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)