我试图理解简单的音乐数据库设计。有些表只包含外键和主键。我不确定如何以及何时使用这些表或插入其中的内容。设计看起来像这样:
Track:
id primary key
title
duration
live-performance (true or false)
year
Artist:
id primary key
name
ArtistTrack:
id primary key
artistID
trackID
Album:
id primary key
title
AlbumTrack:
id primary key
albumID
trackID
track-number
Genre:
id primary key
name
GenreTrack:
id primary key
genreID
trackID
例如,如果我将曲目插入Track
表并将艺术家插入Artist
表,那么我应该将哪些内容插入ArtistTrack
表?我假设ArtistTrack
表中的属性是与各自表中的主键相同的数字?
我见过几个与此相似的设计,我只是没有得到它。我知道外键将表链接在一起。有人能给我一个如何使用这些表的例子吗?
答案 0 :(得分:3)
ArtistTrack
表是一个联结表,是表示M:N关系的经典方式。如果您在trackId
表格中引用Artist
,则表示每位艺术家可以拥有(最多)一首曲目。假设这不是一个管理一个命中奇迹的数据库,那就错了。如果您在artistId
表格中引用了Track
,则每个曲目可以由(最多)一个艺术家组成。如果您想允许此数据库中的协作,那也是错误的。
解决方案是拥有一个ArtistTrack
表,正如您所指出的,它只是对相关艺术家和曲目的引用。 E.g:
-- Insert the track:
INSERT INTO Track VALUES (1, 'some track', 10, false, 1999);
-- Insert a couple of artists:
INSERT INTO Artist VALUES (1, 'Jay');
INSERT INTO Artist VALUES (2, 'Silent Bob');
-- Make them collaborate on this track
INSERT INTO ArtistTrack VALUES (1, 1, 1);
INSERT INTO ArtistTrack VALUES (2, 2, 1);
答案 1 :(得分:2)
有许多方法可以创建任何数据库,并且没有针对此类事物的通用规则。根据应用程序的需要以及您使用的数据库软件类型,您可能会以不同方式存储数据。
话虽如此,如果您希望将此表设计用于传统的关系数据库,您可能会按照以下针对您提到的Artist-Track情况执行此操作:
如果您要使用新艺术家输入新曲目,则首先输入新曲目及其相关数据(标题,持续时间,现场表演,年份),然后输入艺术家及其相关数据(名称)。然后,要将Artist与Track相关联,您需要在ArtistTrack表中添加一行,其中包含primary_id(随机和唯一键)以及artistID和trackID的外键。 ArtistTrack中的外键是您刚输入的曲目和艺术家的主键。
我猜测你的桌子结构正如你所描述的那样是因为允许有很多艺术家的轨道的潜力,而艺术家有许多曲目。由于这两个实体之间存在多对多关系,因此可以使用桥接或关联表(ArtistTrack)轻松查找曲目和艺术家以查找它们之间的关联。
答案 2 :(得分:1)
您想知道的表格,例如" GenreTrack"或" AlbumTrack",用于存储例如曲目和流派分别结合了任何曲目如何适合哪张专辑。这是在规范化数据库中存储所谓的n:m关系的常用方法。 让我们以GenreTrack为例。 说表"流派"包含以下内容:
id | name |
G1 | Rock |
G2 | Blues |
G3 | Pop |
和" Tracks"看起来像这样:
id | title | duration | live | year
T1 | "Pictures of You" | 7:68 | FALSE | 2006
T2 | "A Song for the Lovers | 5:25 | FALSE | 1999
现在,您希望灵活地将音乐类型分配给音轨。 也许你想拥有"歌曲为情人" being a" Pop"以及" Rock"歌曲。毕竟,类型在某种程度上存在争议。
所以,为此,一个简单的外键在" Tracks"桌子在这里没有帮助。您需要单独存储它。这就是" GenreTrack"桌子发挥作用。 它保留了" Tracks"的所有组合。和"流派"。 其中的条目可能如下所示:
id | genreID |trackID
GT1 | G1 | T1
GT2 | G3 | T2
GT3 | G1 | T2
现在,你可能想知道,为什么这张桌子让它拥有了自己的" id"柱。实际上,没有必要将它作为规范化表格,因为你可以使用" genreID"和" trackID"形成复合主键。但是,一些数据库框架显然不支持复合键,并且需要所有表的代理键,这可能是这个" id"专栏。
直接选择此数据:
SELECT t.title, t.year, g.name as genre_name
FROM
"Tracks" t
left outer join "GenreTrack" gt
on t.id = gt."trackID"
left outer join "Genre" g
on gt."genreID" = g."id";
导致:
Title | Year | Genre
"Pictures of You" | 2006 | Rock
"A Song for the Lovers" | 1999 | Rock
"A Song for the Lovers" | 1999 | Pop
希望能让您了解这些m:n表格。
答案 3 :(得分:0)