关于表格之间的设计关系的建议

Advice on design relations between tables

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

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

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

底线是您需要外键。您的 table 目前每个 table 都有一个不同的 ID,命名为 id:

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

这里的关键词是"relational"。您需要关联 table。也许你会通过更好地命名你的 ID 来设计它:

artist.artist_id
album.album_id
genre.genre_id

然后在专辑 table 中,您将添加 artist_id 和 genre_id 的列,以便您可以将它们加入到艺术家和流派 tables

如果没有 FK,您将得到笛卡尔积。就这么简单。

您需要阅读关系数据库简介 tables 和查询。

您所说的 table 之间的 "relations" [原文如此] 是 FK(外键)。 FK 表示 table 中列列表的值显示为 table 中形成 PK(主键)或 UNIQUE 集的其他列列表的值。您无需声明或使用 FK 即可查询。与所有约束(包括 PK 和 UNIQUE)一样,它们用于 DBMS 排除错误的数据库状态。

一个(基础或查询结果)table代表一个(business/application)关系(船)/关联。 table 包含从关联的 predicate(语句模板)中得出某些真 proposition(语句)的行。一个基table的谓词是由DBA给出的。查询结果的谓词 table 遵循用户查询表达式中的基础 table 、关系运算符和逻辑运算符。即 JOIN 的谓词是其 tables' 谓词的 AND;联合或;除了 AND 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 and/or 名称,查询仍然 returns 满足该谓词的行。 查询或更新不需要约束(包括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)

而不是有两个 tables Album & AlbumGenre 和他们的 FK 我们可以只有 Album2 这是他们的连接,谓词是他们谓词 album A has name N and ... and album A is of genre G 的 AND/conjunction FOREIGN KEY Album2 (G) REFERENCES Genre (G)。然后 规范化 会告诉我们,如果每张专辑有一个流派,那么这是一个 OK 设计,否则原始版本更好。与 Artist2 类似,将 ArtistAlbum 组合到 Artist 中(如果艺术家创作了一张专辑,这是合理的)。或者将 ArtistAlbum 和 AlbumGenre 都放入 Album3(如果一张专辑只有一位作者和一种流派,则合理)。但是,无论查询和更新是否重要,都是谓词,而不是基数或约束。

所以您的设计缺少像 ArtistAlbum 和 AlbumGenre 那样合适的predicates/columns/tables。 (您可能希望将其与上面的其他 table 组合。)

PS 你的问题是关于 "genre", "genre1" & "genre2".