SQL - 将人们作为音乐家和艺术家存储的最佳桌面设计是什么?

时间:2011-09-17 20:41:55

标签: sql database database-design

我正在使用SQL Server 2008。

我正在设置一个新的数据库来存储音乐专辑信息。我需要知道设置表格的最佳方法,并需要一些输入。让我给你一些定义,以便你可以帮助我。

艺术家:AC / DC,Led Zeppelin,Michael Jackson,Crosby,Still和Nash,Lady Gaga。这是个人或团体的名称。如果它是一个群体,它代表了许多音乐家。如果它是个人,它代表音乐家的表演实体。

音乐家:这显然是一个人,如Angus Young,Michael Jackons或Stevie Ray Vaughn。

我的表格如下:

ARTISTS // table name
ArtistID // pk
Artist // name of artist, such as AC/DC / Michael Jackson / Lady Gaga

MUSICIANS // table name
MusicianID // pk
FirstName // first name of artist such as Angus, Michael, or Stephanie
LastName // such as Young, Jackson, or Germanotta 
Pseudonym // such as Lady Gaga

ARTISTS_MUSICIANS // junction table name
RecordID // pk
ArtistID // fk
MusicianID // fk
当我考虑加入像Lady Gaga和Michael Jackson这样的人时,会出现混乱。是否有一面旗帜,我应该用它来表明迈克尔·杰克逊是一个人还是一个实体,然后同时添加两个记录?有没有办法添加两个记录?

此外,还有像Steely Dan这样的艺术家。 Donald Fagen和Walter Becker组成了两个关键音乐家。但他们有很多音乐家在播放每首歌曲。所以,我需要能够将音乐家与唱片以及歌曲联系起来。

具体来说,能够看到迈克尔杰克逊既是表演实体又是音乐家的最有效方式是什么?

在走错路之前,我会欣赏好的想法,并创造出一大堆意大利面无用的数据。

4 个答案:

答案 0 :(得分:3)

为了完整起见,我会让独立艺术家同时注册为音乐家和艺术家,因为有些艺术家可能会独自表演并成为另一乐队的一员。

我不会向Artist添加任何“flag”字段以表明它是一个独奏者,因为它可能会在以后发生变化,除非你添加一个触发器或类似的东西,否则它可能会给出错误的信息(即你添加一个新组音乐家,但忘了改变旗帜 - >不匹配)。

要检查音乐家是否是独奏演员,您只需加入ala“musician< - >艺术家< - >音乐家”,如果它返回多行,则不是独奏演员。

答案 1 :(得分:2)

enter image description here

我会创建5个表:RecordRecord_ArtistArtistArtist_MusicianMusician。 像Michael Jackson这样的音乐家/艺术家在两个表格中都有一个数据集:艺术家和音乐家。此外,Michael Jacksons的音乐家唱片也与艺术家“非洲的美国”有关。我不会将任何音乐家与Record直接联系起来 - 只是Artists

答案 2 :(得分:2)

我几年前建立了一个cd数据库,不一定非常好。我很快发现我需要一个'曲目'表 - 一张CD由曲目组成,音乐家在曲目上播放,人们为曲目编写歌曲等等。另外,cd的艺术家不是必然是赛道的艺术家 - 想想可能是同质的编辑(Steely Dan的例子很好,因为它可能包含Fagen或Becker的独奏曲目)或异质的(2011年的热门歌曲)。

关于上面的Led Zeppelin示例,该曲目的艺术家将是LZ,而曲目的音乐家将是四个人。

答案 3 :(得分:0)

这样做的一种方法是使ARTIST递归,使用外键进入自身,如下所示:

create table ARTIST (
    id identity not null,
    name varchar(80), 
    group_id integer,
    primary key(id),
    foreign key(group_id) references artist(id)
);

“Led Zeppelin”的ARTIST行将在ARTIST中有四行(“Robert Plant”,“Jimmy Page”,“John Bonham”和“John Paul Jones”)键将指向“Led Zeppelin”行。

具有空外键ARTIST的{​​{1}}行本身就是一个实体。