在阅读完本书并阅读一些youtube教程后,我对规范化的理解是,其中一个重要的事情就是没有重复的值。更具体地说,主键(ID)不应重复。
因此,如果我正在使用音乐/音乐会数据库中的某些表格,那么以下内容会很糟糕:
**CREATE TABLE Artists**
ArtistID INT *PRIMARY KEY*
ArtistName VARCHAR(30)
Albums
问题:这样的表是否应该有一个与另一个表绑定的外键?我想到的相关表格显然是专辑。
相册会有以下列:
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主键,我可以吗?因此,我应该将“歌曲”属性保留在“影集”表中吗?
答案 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
中的相关行。
这些示例基于所描述的简单的一对多关系。
将实体之间的关系的这些规则变为合理的表示非常重要。我们需要知道关系是一对多还是多对多。