Sql 宋爱德

Sql 宋爱德,sql,database,rdbms,erd,Sql,Database,Rdbms,Erd,在阅读维基百科时,我看到了艺术家和歌曲之间定义的以下关系: 来源: 下文说明如下: 使用鱼尾纹符号显示的两个相关实体。在本例中,显示了艺术家和歌曲之间的可选关系;最接近歌曲实体的符号表示“零、一或多”,而歌曲有“一个且只有一个”艺术家。因此,前者被理解为艺术家可以表演“零首、一首或多首”歌曲 现在我对这种关系有一些疑问,因为定义的关系对我来说似乎不现实: 1) 在现实生活中,一首歌可能有1到多个艺术家,他们可能会表演甚至创作这首歌,因此在我看来,正确的关系应该显示“-IE”,而不是“-II”

在阅读维基百科时,我看到了艺术家和歌曲之间定义的以下关系:

来源:

下文说明如下:

使用鱼尾纹符号显示的两个相关实体。在本例中,显示了艺术家和歌曲之间的可选关系;最接近歌曲实体的符号表示“零、一或多”,而歌曲有“一个且只有一个”艺术家。因此,前者被理解为艺术家可以表演“零首、一首或多首”歌曲

现在我对这种关系有一些疑问,因为定义的关系对我来说似乎不现实:

1) 在现实生活中,一首歌可能有1到多个艺术家,他们可能会表演甚至创作这首歌,因此在我看来,正确的关系应该显示“-IE”,而不是“-II”

2) 艺术家如何表演0首歌曲“-0E”-如果实体名称的字典定义成立,则该实体不应再被归类为艺术家,对吗?(请不要留下评论,说看到过自称艺术家但不能演唱歌曲的人——我必须同意)根据所示的DB关系,艺术家分类被赋予一个不能演唱歌曲的实体,因此在设计ERD时,实体的字典定义是否也应规定实体关系?如果是这样的话,在DB关系建模中,这种类型的规划是否有一个特定的名称,以考虑给实体的名称的定义

3) 在ERD中,“performs”动词用于显示关系动作,而在其他ERD中,当图表以可视化方式表示时,我没有看到为关系定义动词的地方。是否有必要在ERDs中定义和显示该动词?我问的原因是,在上述情况下,“performs”动词可能是一个糟糕的选择,如果选择了“creates”动词,那么这个关系可能是正确的,艺术家可能会创作0到*首歌曲,但由于为关系选择的动词,正如我上面提到的,它破坏了语句试图描述的逻辑连接,从而使其成为无效关系。基于此,在DB关系图中选择的动词是否不是强制性的?

问题#1

在现实世界中,我们通常认为一首歌是由许多不同的艺术家所表演的。例如,甲壳虫乐队的歌曲有多少次是由不同的艺术家以不同的方式演唱的

然而,在数据世界中,它很可能被视为一个单独的歌曲实体,因为这将允许记录新版本歌曲中的所有差异,例如不同的安排等。如果按照您的建议对系统进行建模,将没有任何方法(或者可能没有简单的方法)获取这些信息

这就是我的合理假设,为什么图表以这种方式对关系进行建模。正如您所建议的,将艺术家歌曲关系建模为多对多在技术上没有问题,但这取决于您正在构建的系统的性质和要求

问题2

基数(可选、强制、一、多等)表示实体/关系可以在什么条件下存在。用通俗易懂的英语来说,这个图表应该更像是“一个艺术家可以存在,但没有任何相关的歌曲。一首歌曲不能存在,除非它与一个艺术家相关”。我不确定我是否误解了你所说的“字典定义”和“不能”的意思,所以如果我没有正确地阐述这一点,请告诉我。我当然可以从动词用法上看出你的困惑,但请记住,这是关于存在,而不是执行动作的能力

问题#3

动词本身有助于澄清这种关系。如果可以用通俗易懂的语言阅读系统的组件,就更容易理解它们。它还帮助您了解系统本身的性质。也就是说,这个数据库可能是为了记录艺术家和他们的歌曲表演,而不一定只是一个歌曲和艺术家的目录

关于省略动词,我想在某些情况下,作者会觉得很明显,或者添加动词可能会使图表变得混乱等等。基本上,如果您只想知道如何在数据库中实现关系,那么您真正需要知道的就是关系的类型(一对多等)和约束(强制性、选择性等)。动词在一定程度上是sugar

在这个图表中,尽管它似乎不是这样建模的,但假设这个数据库也记录了谁写了这首歌。这样,可能有另一个关系,来自一个名为“抒情者”的实体和一个动词“writes”。创作/写这首歌的人可能与演唱这首歌的人不一样。现在,无可否认,我们正在深入了解细节,因为我们可以说一首歌是由许多不同实体(歌词、乐器、安排等)组合而成。但这超出了原始图表的范围


让我知道这是否澄清了问题。

我想我现在在第三个问题的答案中看到了你的观点,你说:“这个数据库可能是用来记录艺术家及其歌曲表演的,而不一定只是歌曲和艺术家的目录。”动词“perform”用于实际演唱某首特定歌曲的艺术家,该歌曲不一定与演唱披头士歌曲的艺术家有关。如果埃尔顿·约翰从未演唱过Metallica歌曲,这或许也可以解释0基数的情况;这一事实不会玷污他的“艺术家”凭证以任何方式,但仅声明->他从未执行过