1

我有关于音乐相册的信息,我想在RDBMS表格中组织它们之间的关系。我有每个专辑的以下信息:艺术家,专辑名称,年份,标签,流派,风格,评级。到目前为止,我认为要制作4张表格 - 艺术家,专辑(名称,年份,标签,评级),流派1和流派2(每种流派都有其风格)。在这张图上,它看起来如下:关于表格间设计关系的建议

enter image description here

但是还不知道如何建立相册和其他三个表之间的连接?即,当我将运行查询select name from artists我希望收到一个具有相应艺术家和流派风格的专辑。

在这种情况下我应该如何建立表格之间的关系?

回答

0

您需要阅读关系数据库表&查询简介。

您所说的表格之间的“关系”[原文如此]是FK(外键)。 FK表示表中列的列表的值显示为表中某些列的其他列的值,这些列在表中形成PK(主键)或UNIQUE。您不需要声明或使用FK进行查询。像所有约束一样,包括PK & UNIQUE,它们用于DBMS排除错误的数据库状态。

A(基本或查询结果)代表(商业/应用)关系(船)/关联。一张表包含来自关联的谓词(语句模板)的一些真实命题(语句)的行。基表的谓词由DBA给出。查询结果表的谓词遵循用户查询表达式中的基表,关系运算符&逻辑运算符。即JOIN的谓词是其谓词的AND;联合OR; AND NOT NOT除外; ON和WHERE条件AND条件与JOIN谓词; etc

-- artist A has name N 
Artist(A, N) 
-- album A has name N and ... 
Album(A, N, ...) 
-- genre G has name N 
Genre(G, N) 
-- artist A authored album A2 
ArtistAlbum(A, A2) 
-- album A is of genre G 
AlbumGenre(A, G) 

SELECT DISTINCT ... 
FROM 
    --  album ag.A is of genre ag.G AND genre g.G has name g.N ... 
    -- AND ag.G = g.G ... 
    AlbumGenre ag JOIN Genre g ON a.G = g.G ... 

注意不要紧多少流派的专辑可以有或者多少张专辑流派可以有或流派是否可以有多个ID和/或名称,查询仍返回行时,满足那个谓词。 约束(包括FK)不需要查询或更新。

请注意,我们可以应用相同的谓词变换加上其他变量来编写约束。 (我使用A作者&专辑,所以我不得不在这里给一个重命名的例子。)

-- for all A & A2, if artist A authored album A2 then artist A has some name 
-- for all A & A2, if artist A authored album A2 then for some N, artist A has name N 
-- for all A & A2, if (A, A2) in ArtistAlbum then for some N, Artist(A, N) 
-- SELECT A FROM ArtistAlbum ⊆ SELECT A FROM Artist 
FOREIGN KEY ArtistAlbum (A) REFERENCES Artist (A) 

-- for all A & A2, if artist A authored album A2 then album A2 has some name 
-- for all A & A2, if artist A authored album A2 then for some N, ..., album A2 has name N and ... 
-- for all A & A2, if (A, A2) in ArtistAlbum then for some N, ..., (A2, N, ...) in Album 
-- SELECT A2 FROM ArtistAlbum ⊆ SELECT A AS A2 FROM Album 
FOREIGN KEY ArtistAlbum (A2) REFERENCES Album (A) 

-- for all A & G, if album A is of genre G then album A has some name and ... 
-- for all A & G, if album A is of genre G then for some N, ..., album A has name N and ... 
-- for all A & G, if (A, G) in AlbumGenre then for some N, ..., (A, N, ...) in Album 
-- SELECT G FROM AlbumGenre ⊆ SELECT A FROM Album 
FOREIGN KEY AlbumGenre (A) REFERENCES Album (A) 

-- for all A & G, if album A is of genre G then genre G has some name 
-- for all A & G, if album A is of genre G then for some N, genre G has name N 
-- for all A & G, if (A, G) in AlbumGenre then for some N, (G, N) in Genre 
-- SELECT G FROM ArtistAlbum ⊆ SELECT G FROM Genre 
FOREIGN KEY AlbumGenre (G) REFERENCES Genre (G) 

不是有两个表的专辑& AlbumGenre和他们的FK,我们可能只是Album2那是他们的加盟,与谓词是他们的谓词album A has name N and ... and album A is of genre GFOREIGN KEY Album2 (G) REFERENCES Genre (G)的AND /连词。然后正常化会告诉我们,如果每张专辑有一个类型,那么这是一个好的设计,但否则,原来更好。同样,Artist2将ArtistAlbum结合到Artist中(如果艺术家创作了一张专辑,则是合理的)。或者两个ArtistAlbum & AlbumGenre放入Album3(如果专辑有一个作者和一个流派,则是合理的)。但不管所有重要的查询&更新是谓词,而不是基数或约束。

因此,您的设计缺少类似ArtistAlbum & AlbumGenre的相应谓词/列/表格。 (您可能希望与上面的其他表格结合使用。)

PS您的问题不清楚“流派”,“流派1”&“流派2”。

-1

底线是你需要外键。您的表格当前每个表名为id都有一个不同的id:

artist.id 
artist.name 
album.id 
album.album 
album.year 
album.label 
album.rating 
genre.id 
genre.name 
genre.id 
genre.name 

关键词在这里是“关系”。你需要关联这些表格。

artist.artist_id 
album.album_id 
genre.genre_id 

然后在专辑表,您将添加列artist_id和genre_id这样你就可以加入他们回到艺术家和流派表

没有:也许你会被命名你的IDS更好地设计这个FKs,你将有一个笛卡尔产品。就那么简单。

+0

然后在'album'表中,我需要添加一个'artist_id'和'genre_id'列,它将指向'artist'和'genre'表中的相应行? 我想过两个'genre'表,因为一个会用于摇滚,另一个用于爵士。 –

+0

我编辑我的帖子来解决你的第一个问题。关于流派,您在创建2个流派表中完全击败了表格的目的。爵士队是拥有自己的关键的一排,洛克是另一排有自己的关键。这与您为什么不为每位艺术家建立表格或每张专辑的表格是相同的概念。 – fleetmack

+1

@VitaliiPlagov&fleetmack PKs/UNIQUEs&FKs不需要查询。例如,只要连接处于ON状态,就不会有交叉产物,即不必是PK/UNIQUE或FK,即一列不具有*为另一列的子集这是PK/UNIQUE(即FK),并不需要与PK/UNIQUE进行比较。看到我的答案。 – philipxy