0

所以我需要制作一个用于管理歌曲/CD 的注册包。我的问题是我需要将艺术家链接到曲目,但它可能是一个乐队或只是一个艺术家,但我不知道我需要如何做到这一点。

现在有这个:http: //imgur.com/V71UX

在歌曲中,可以添加乐队或艺术家或两者兼而有之。所以乐队存在艺术家,这就是为什么他们之间有一张桌子。

现在出现的问题是,由于外键的原因,不可能将其中一个留空,但我觉得不仅如此,而且我这样做是错误的。

有人可以推动我朝着正确的方向前进吗?

4

2 回答 2

1
track
    id
    title

artist
    id
    name

band
    id
    name

artist_band
    artist_id
    band_id

artist_track
    artist_id
    track_id

band_track
    band_id
    track_id
于 2012-11-17T18:07:58.723 回答
1

您可以将n_artistand定义n_band为 allowed NULLs。当列是 时,不检查外键约束NULL

然后,您还可以包含一个CHECK约束。您可以强制这些列中至少有一个不为空。或者您可以强制其中一列不为空。哪个正确取决于您的域。对于乐队和艺术家,我通常认为第二个是正确的(即,我会将曲目定义为乐队或艺术家的曲目。我不确定应该对与两者相关的曲目施加什么解释)

CREATE TABLE T (
     /* Other Columns */
     BandID int null,
     ArtistID int null,
     /* Other constraints */
     constraint FK_Bands FOREIGN KEY (BandID) references Bands (ID),
     constraint FK_Artists FOREIGN KEY (ArtistID) references Artists (ID),
     constraint CK_SingleAssociation CHECK (
          (BandID is null and ArtistID is not null) or
          (BandID is not null and ArtistID is null)
     )
)
于 2012-11-17T18:12:24.487 回答