music/concerts 数据库的规范化

Normalization for music/concerts database

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

因此,如果我在 Music/Concert 数据库中使用一些 Table,那么以下内容将是错误的:

**CREATE TABLE Artists**                                                     

ArtistID INT *PRIMARY KEY*
ArtistName  VARCHAR(30)                        
Albums      

问题:像这样的 table 是否应该有一个外键绑定到另一个 Table?我会想到的相关table显然是相册。

相册的列如下:

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 主键,我可以吗?因此,我是否应该将属性 'Songs' 保留在专辑 table 之外?

您需要阅读 Connolly 和 Begg 的 Database Systems - 他们将清楚地定义什么使数据相关,如何定义实体,以及何时规范化数据,但是是的,可以回答您是否应该使用外键的问题在歌曲 table 到 link 中,歌曲中的艺术家 - 记住这 table 将保留歌曲,这意味着艺术家 ID 自然会出现多次,依此类推,正确地研究实体这会有所帮助。

问题:像这样的 table 是否应该有一个与另一个 Table 关联的外键?我会想到的相关table显然是Albums.

如果艺术家和专辑之间的关系是一对多...(如果规则是一个 "artist" 可以有零个、一个或多个 "albums",以及一个 "album" 正好属于一个 "artist")

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

像这样:

艺术家:

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

专辑:

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

通过在 albumartist_id 列中存储一个值,这是对 artist table.

中一行的引用

艺术家:

 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

问:但是专辑里有歌曲。 ... 因此我应该将属性 'Songs' 保留在专辑 table 之外吗?

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

像这样:

歌曲:

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 table 中的一行中,我们可以使用存储在 album_id 列中的值来查找相关的 album.

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


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

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