我有关于我想在RDBMS表中组织的音乐专辑的信息,以及它们之间的关系。每张专辑都有以下信息:艺术家,专辑名称,年份,标签,流派,风格,评级。到目前为止,我认为制作4个表 - 艺术家,专辑(名称,年份,标签,评级),genre1和genre2(每种类型的风格)。在图上,它看起来如下:
但是我不知道如何在专辑和其他三个表之间建立连接?即,当我将运行查询select name from artists
时,我希望收到一张具有相应艺术家和流派风格的专辑。
在这种情况下,如何在表之间建立关系?
答案 0 :(得分:0)
您需要阅读关系数据库表和简介的介绍。查询。
您正在谈论的表之间的“关系”[原文如此]是FK(外键)。 FK表示表中列列表的值显示为表中形成PK(主键)或UNIQUE的其他列的其他列的值。您无需声明或使用FK进行查询。像所有约束一样,包括PK& UNIQUE,它们用于DBMS排除错误的数据库状态。
(基础或查询结果)表表示(业务/应用程序)关系(发货)/关联。表格包含从关联的谓词(语句模板)中创建一些真正的命题(语句)的行。 DBA给出了基表的谓词。查询结果表的谓词来自基表,关系运算符&用户查询表达式中的逻辑运算符。即JOIN的谓词是其表的谓词的AND; UNION OR;除了AND NOT;条件的ON和WHERE以及使用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)
而不是有两张表Album& AlbumGenre和他们的FK我们可以只有Album2作为他们的连接,谓词是谓词album A has name N and ... and album A is of genre G
和FOREIGN KEY Album2 (G) REFERENCES Genre (G)
的AND /连词。然后规范化会告诉我们,如果每张专辑有一种类型,那么这是一个好的设计,但原来更好。同样,Artist2将ArtistAlbum合并为艺术家(如果艺术家创作一张专辑则合理)。或者ArtistAlbum& AlbumGenre进入Album3(如果专辑有一个作者和一个类型,则合理)。但无论如何重要的是查询&更新是谓词,而不是基数或约束。
因此,您的设计缺少适当的谓词/列/表,如ArtistAlbum& AlbumGenre。 (您可能希望与上面的其他表结合使用。)
PS你的问题不清楚“流派”,“genre1”和& “genre2”。
答案 1 :(得分:-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
关键词是"关系"这里。您需要关联表格。也许您可以通过更好地命名您的ID来设计它:
artist.artist_id
album.album_id
genre.genre_id
然后在相册表格中,您将为artist_id和genre_id添加列,以便您可以将它们连接回艺术家和流派表格
如果没有FK,您将拥有笛卡尔积。就这么简单。