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