Database design ERD一个表到多个表的关系

Database design ERD一个表到多个表的关系,database-design,uml,data-modeling,erd,Database Design,Uml,Data Modeling,Erd,我正在创建一个ERD,某些部分让我头疼 我的问题: 我有四个实体:杂志、书籍、报纸和网页。 每个实体都有自己的属性 我想记下这四个来源中的每一个。但是注释只能指其中一个。例如,书上的便条不能是杂志、报纸或网页上的便条。 此外,还可以在杂志、书籍、报纸或网页上做多个注释 经过几天的反复试验,搜索网络和旧式书籍,我仍然找不到一种方法来模拟这个 我想我需要使用一个N元关联,但是我不确定。 有人能帮我吗?这应该如何建模 另一方面:我正在使用企业架构师进行建模 编辑: 在思考问题、思考答案和评论的同时,我

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

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

我想记下这四个来源中的每一个。但是注释只能指其中一个。例如,书上的便条不能是杂志、报纸或网页上的便条。 此外,还可以在杂志、书籍、报纸或网页上做多个注释

经过几天的反复试验,搜索网络和旧式书籍,我仍然找不到一种方法来模拟这个

我想我需要使用一个N元关联,但是我不确定。 有人能帮我吗?这应该如何建模

另一方面:我正在使用企业架构师进行建模

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

这感觉像是我需要的,但在这种情况下,我认为仍然有可能将一张便条绑在一本杂志和一本书(以及一份报纸和一个网站)上。这些应该是一个新的目标


希望这能让事情更清楚一点。希望我的多重性是正确的(我想我已经看得太久了)。

一种方法是创建一个超类型(我们称之为出版物),你可以在上面挂笔记。我们可以包括互斥限制,以防止出版物扮演多个角色

我知道你问过如何建模,但我给你的不是一个图,而是SQLDDL。我的建模工具无法正确设置杂志的外键

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”)用于区分杂志、书籍、报纸和网页。我没有显示过去三年的表格,它们类似于杂志的模式

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

编辑:

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

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
);

在这种情况下,实施互斥就不那么容易了,也就是说,一个值得注意的id理论上可以重用。

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

如果您真的需要一个
Notes
实体,您可以这样建模您的需求:


EditOP将
0..1
多重性定义为
0..n
。不过,这种关系在任何其他方面都不会改变。

我想我在这方面做得太多了。我知道表有列,实体之间有关系。我一直在思考的方式是,我会有一个名为note_to_entity(或note_to_publication,或其他什么)的表,而不是出版物,它实际上将表note中的一行链接到表杂志、书籍、报纸或网站中的一行之间。我理解您的意思,但不知为何-无法确切说明原因,但我认为这与我不喜欢的出版物类型专栏有关——我感觉你的解决方案不是我想要的。但是再一次,我知道自己会把事情复杂化,类型列可能是唯一/正确的解决方案。在这种情况下,问题出现了:为什么类型列也应该在表M、B、N和W中?我已经知道它是关于那个表的,因为我有类型。这是一种用于强制相互排斥的子类型的技术。它防止将行插入同一实体(publication_id)的两个子类型表(例如杂志和书籍),因为外键约束必须在id和类型上匹配,并且publications表的行中只能记录一种类型。@philipxy因为您在这里引用了我,请阅读下面我在回答中的评论:-)@MichaelAlbers&reaanb:1号设计不需要出版物类型。第二种设计不需要为每种发布类型同时使用id和id。而且这两种设计都不需要发布/显著ID表。(这只是单独表中ID的并集,)只是大多数SQL DBMS不支持大多数约束的简单表达式,但添加冗余列和/或表可以允许(某些)通过简单支持的约束(如FKs)进行约束。(注意,有人指出enum可以做到这一点&第二个设计就是将其添加到先前的无注释设计中的一个例子。)Michael说,应该可以在杂志、书籍、报纸或网页上制作多个注释。问题是,一个实体可以有0个..*注释。这就是为什么我认为我需要一个N元关联,但当将ERD转换为数据模型(在EA中)时,它似乎并不正确。或者一个不相交的——可能与一个N元关联相结合——是一种选择吗?当我在EA示例文件上或在EA示例文件中检查示例时,不相交看起来就像我想要的。虽然,如果一个不相交可以是一个或两个“选项”,这不是我需要的。@reaanb实际上Michael没有特别提到
0..n
(除非你把“notes”读成这个复数)。但显然,他的意思是
0..n
。迈克尔:我来看看这个链接。看看这个例子。我很久没有在EA中使用DB设计了。但是我猜转换会为每个引用的类添加一个外键到
Notes
。您需要手动调整约束,就像在@reaanb的第一个示例中,您有一个枚举,告诉(单个)外键引用哪个id。一般来说