音乐/音乐会数据库的规范化

时间:2017-04-11 18:03:05

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

在阅读完本书并阅读一些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主键,我可以吗?因此,我应该将“歌曲”属性保留在“影集”表中吗?

2 个答案:

答案 0 :(得分:0)

你需要阅读Connolly&amp ;; Begg - 谁会清楚地定义数据关系是什么以及如何定义实体,以及何时标准化数据,但是回答你关于是否应该使用歌曲表中的外键将艺术家链接到歌曲的问题 - 是的这个表会保存歌曲,这意味着艺术家ID会自然出现多次,依此类推,研究实体也会有所帮助。

答案 1 :(得分:0)

问题:这样的表是否应该有一个与另一个表绑定的外键?我想到的相关表格显然是专辑。

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

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

这样的事情:

艺术家:

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

相册:

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

将值存储在artist_id的{​​{1}}列中,这是对album表中某行的引用。

艺术家

artist

专辑:

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

问题:但专辑有歌曲。 ...因此,我应该保留属性' Songs'在相册表中?

是。如果它是 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 album之间的一对多关系,则将song存储在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中的相关行。

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

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