所以我需要制作一个用于管理歌曲/CD 的注册包。我的问题是我需要将艺术家链接到曲目,但它可能是一个乐队或只是一个艺术家,但我不知道我需要如何做到这一点。
现在有这个:http: //imgur.com/V71UX
在歌曲中,可以添加乐队或艺术家或两者兼而有之。所以乐队存在艺术家,这就是为什么他们之间有一张桌子。
现在出现的问题是,由于外键的原因,不可能将其中一个留空,但我觉得不仅如此,而且我这样做是错误的。
有人可以推动我朝着正确的方向前进吗?
所以我需要制作一个用于管理歌曲/CD 的注册包。我的问题是我需要将艺术家链接到曲目,但它可能是一个乐队或只是一个艺术家,但我不知道我需要如何做到这一点。
现在有这个:http: //imgur.com/V71UX
在歌曲中,可以添加乐队或艺术家或两者兼而有之。所以乐队存在艺术家,这就是为什么他们之间有一张桌子。
现在出现的问题是,由于外键的原因,不可能将其中一个留空,但我觉得不仅如此,而且我这样做是错误的。
有人可以推动我朝着正确的方向前进吗?
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
您可以将n_artist
and定义n_band
为 allowed NULL
s。当列是 时,不检查外键约束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)
)
)