music/concerts 数据库的规范化
Normalization for music/concerts database
在阅读了我的书并浏览了一些 youtube 教程后,我对规范化的理解是,重要的事情之一是不要有重复值。更具体地说,主键 (ID) 不应重复。
因此,如果我在 Music/Concert 数据库中使用一些 Table,那么以下内容将是错误的:
**CREATE TABLE Artists**
ArtistID INT *PRIMARY KEY*
ArtistName VARCHAR(30)
Albums
- ^在艺术家 table 中有专辑会很糟糕,因为有一个
许多专辑的艺术家。因此 ArtistID 必须出现
多行[艺术家每张专辑一次]
问题:像这样的 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
通过在 album
的 artist_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 之外吗?
是的。如果 album
和 song
之间是一对多关系,则将 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
中的相关行。
这些示例基于所描述的简单的一对多关系。
重要的是我们将实体之间关系的这些规则转化为合理的表示。我们需要知道一个关系是一对多还是多对多。
在阅读了我的书并浏览了一些 youtube 教程后,我对规范化的理解是,重要的事情之一是不要有重复值。更具体地说,主键 (ID) 不应重复。
因此,如果我在 Music/Concert 数据库中使用一些 Table,那么以下内容将是错误的:
**CREATE TABLE Artists**
ArtistID INT *PRIMARY KEY*
ArtistName VARCHAR(30)
Albums
- ^在艺术家 table 中有专辑会很糟糕,因为有一个 许多专辑的艺术家。因此 ArtistID 必须出现 多行[艺术家每张专辑一次]
问题:像这样的 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
通过在 album
的 artist_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 之外吗?
是的。如果 album
和 song
之间是一对多关系,则将 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
中的相关行。
这些示例基于所描述的简单的一对多关系。
重要的是我们将实体之间关系的这些规则转化为合理的表示。我们需要知道一个关系是一对多还是多对多。