【问题标题】:Normalization for music/concerts database音乐/音乐会数据库的规范化
【发布时间】:2017-09-07 06:27:06
【问题描述】:

在阅读了我的书并浏览了一些 youtube 教程后,我对规范化的理解是,重要的事情之一是没有重复值。更具体地说,主键 (ID) 不应重复。

因此,如果我正在使用音乐/音乐会数据库中的一些表,那么以下情况将很糟糕:

**CREATE TABLE Artists**                                                     

ArtistID INT *PRIMARY KEY*
ArtistName  VARCHAR(30)                        
Albums      
  • ^在 Artists 表中有专辑会很糟糕,因为有一个 许多专辑的艺术家。因此必须显示 ArtistID 多行[艺术家的每张专辑一次]

问题:这样的表是否应该有一个与另一个表相关联的外键?我会想到的相关表显然是相册。

相册会有这样的栏目:

CREATE Table Albums (
       Album_ID INT NOT NULL AUTO_INCREMENT,
       Album_Name VARCHAR(30), 
       Artist VARCHAR(30),
       Release_Date DATETIME,
       Genre or GenreID,
       Primary Key (Album_ID) );

问题:但专辑有歌曲。但是,我不能将专辑 ID 作为主键,然后让所有歌曲都具有专辑 ID 的重复主键,我可以吗?因此,我应该将“歌曲”属性保留在专辑表之外吗?

【问题讨论】:

  • Q1(A1):但一张专辑不能有多个艺术家吗?所以你不需要一个 AlbumArtists 表来解决艺术家和专辑之间的多对多问题吗? Q2(A2) 是的,歌曲属于它自己的表,至少符合第 3 范式。
  • 我想我对何时使用多对多和一对多更好,反之亦然感到困惑? AlbumArtists 中有什么内容?
  • 您应该很少(从不?)允许多对多持续存在。它应该始终是一对一或一对多。或多对一。 AlbumArtists 将拥有来自专辑和艺术家的 ID。也许发布日期(有些专辑被重构和重新发布,对吗?所以发布日期可能会与出版商(有时是不同的出版商)一起去那里)等等。为什么你不想要多对多是因为没有连接/关联表你不能支持多对多,因为你需要在每个基表中有多个 ID。
  • 像“80 年代最好的专辑”这样的专辑就是一个很好的例子,一张专辑可以包含多个艺术家,因为每首歌都可能来自不同的群体。这是一个很好的例子,说明为什么您需要一个 ArtistAlbum 甚至可能是“AlbumArtistSong”表。
  • 您似乎没有掌握发生了什么。你需要记住和应用定义。 PK 只是你决定称之为的一些 CK。 CK 是一组唯一的列,并且不包含更小的这样的集合。 PK 列不可能可以重复值,那么“不应该”是什么意思?此外,没有“用于”实体的表,只有用于应用程序/业务关系的表。 (尽管 ER 建模以一种受限的方式使用表,将“实体”表与“实体类型”相关联。)

标签: mysql many-to-many primary-key one-to-many database-normalization


【解决方案1】:

问题:这样的表是否应该有一个与另一个表相关联的外键?我会想到的相关表显然是相册。

如果艺术家和专辑之间的关系是一对多...(如果规则是“艺术家”可以有零个、一个或多个“专辑”,并且“专辑”只属于一个“艺术家” )

我们将通过将artist_id 存储为album 表上的外键列来实现该关系。

类似这样的:

艺术家:

artist
------
id           'PK'
name varchar

专辑:

album
-----
id           'PK'
artist_id    'FK ref artist.id'
title
year
artwork

通过在albumartist_id 列中存储一个值,即引用artist 表中的一行。

艺术家:

 id    name
 ----  --------
    1  Kansas
    2  Styx

专辑:

 id    artist_id  name                  year
 ----  ---------  --------------------  ----
  432          1  Leftoverture          1976
  435          1  Point of Know Return  1977
  438          1  Monolith              1979
  561          2  Grand Illusion        1977

问题:但专辑中有歌曲。 ...因此我应该将“歌曲”属性保留在专辑表之外吗?

是的。如果albumsong 之间是一对多关系,则将album_id 存储在song 表中。

像这样:

歌曲:

song
----
id           'PK'
album_id     'FK ref album.id'
song_title
lyrics

歌曲

id    album_id  song_title         
----  --------  ------------------------
6777       435  Dust In The Wind
6801       438  People of the South Wind
5555       561  Come Sail Away 

song表中的一行,我们可以使用album_id列中存储的值来找到相关的album

album表中的一行,我们可以使用artist_id列中存储的值来查找artist中的相关行。


这些示例基于所描述的简单的一对多关系。

重要的是,我们将实体之间关系的这些规则转化为合理的表示形式。我们需要知道关系是一对多还是多对多。

【讨论】:

    【解决方案2】:

    您需要阅读 Connolly & Begg 的 Database Systems - 他们将清楚地定义什么使数据具有关系以及如何定义实体,以及何时规范化数据,但是对于您是否应该在将艺术家与歌曲联系起来的歌曲表 - 请记住,此表将保存歌曲,这意味着艺术家 ID 自然会出现多次,依此类推,适当的研究实体会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      相关资源
      最近更新 更多