sql-有关表之间的设计关系的建议

我有关于音乐专辑的信息,我想在RDBMS表中组织它们之间的关系.每个专辑都有以下信息:艺术家,专辑名称,年份,标签,流派,风格,等级.到目前为止,我认为要制作4张桌子-艺术家,专辑(名称,年份,标签,等级),genre1和genre2(每种风格及其样式).在该图中,它看起来如下:

enter image description here

但是还不知道如何在专辑和其他三个表之间建立联系?即,当我运行查询艺术家的选择名称时,我希望收到具有相应艺术家和流派风格的专辑.

在这种情况下,应如何在表之间建立关系?

最佳答案
您需要阅读有关关系数据库表的介绍.查询.

您所讨论的表之间的“关系” [sic]是FK(外键). FK说,表中列列表的值显示为表中其他列列表的值,这些值构成在那里设置的PK(主键)或UNIQUE.您无需声明或使用FK进行查询.像所有限制一样,包括PK&唯一,它们用于DBMS排除错误的数据库状态.

(基本或查询结果)表表示(业务/应用程序)关系(船)/关联.表格中包含根据关联谓词(语句模板)做出真实命题(语句)的行.基表的谓词由DBA给出.查询结果表的谓词来自基表,关系运算符&用户查询表达式中的逻辑运算符.即,JOIN的谓词是其表谓词的AND. UNION OR;除与非;条件和条件以及该条件与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作为它们的联接,谓词是其谓词的AND /连接词.专辑A的名称为N,并且…,而专辑A属于流派G,具有FOREIGN KEY Album2(G)参考类型(G).然后归一化会告诉我们,如果每张专辑有一种流派,那是可以的设计,否则原始专辑会更好.同样适用于Artist2,将ArtistAlbum组合到Artist中(如果艺术家认证一张专辑,则是合理的).或者是ArtistAlbum& AlbumGenre转换为Album3(如果专辑有一位作者和一种流派,则是合理的).但是无论查询与否,更新是谓词,而不是基数或约束.

因此,您的设计缺少像ArtistAlbum&的适当谓词/列/表. AlbumGenre. (您可能希望与上述其他表结合使用.)

PS:关于“类型”,“类型1”和“ “genre2”.

转载注明原文:sql-有关表之间的设计关系的建议 - 代码日志