我正在创建一个ERD,其中的某些部分让我头疼。
我的问题:我有四个实体:杂志、书籍、报纸和网页。每个实体都有自己的属性。
我想对这四个来源中的每一个做笔记。但一张纸条只能引用其中的一个。例如,书上的注释不能是杂志、报纸或网页上的注释。此外,应该可以在一本杂志、一本书、一份报纸或一个网页上做多个笔记。
经过几天的反复试验和在网络和老式书籍上的搜索,我仍然找不到一种方法来模拟这个模型。
我认为我需要使用N元关联来实现这一点,但我不是很确定。有人能帮帮我吗?这应该如何建模?
顺便说一下:我正在使用Enterprise Architect进行建模。
编辑:在考虑事情和考虑答案和评论时,我创建了这个ERD:

这感觉就是我需要的,但在这种情况下,我认为仍然可以将一个笔记绑定到一本杂志和一本书(以及一份报纸和一个网站)。这些AND应该是OR。
希望这能让事情更清晰一些。希望我的多重性是正确的(我想,我已经看了太久了)。
发布于 2015-08-01 01:02:15
一种方法是创建一个超类型(让我们称其为publications),您可以在其上挂起注释。我们可以包含一个互斥限制,以防止一个出版物扮演多个角色。
我知道您问过如何对其建模,但我给您的不是图表,而是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可以重用。
发布于 2015-08-01 15:37:49
嗯。也许你把事情搞得太复杂了。如果所有注释仅属于单个实体,则它们显然只是该实体的属性。否则,就没有理由让它们自己成为一个实体。
如果你真的需要一个Notes实体,你可以这样建模你的需求:

0..1的多重性应该是由操作员执行的0..n。不过,这种关系在任何其他方面都不会改变。
https://stackoverflow.com/questions/31750720
复制相似问题