数据库(外键)问题

时间:2012-11-17 18:01:52

标签: sql sql-server

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

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

在一首歌中,有可能添加乐队或艺术家或两者。所以艺术家的乐队存在,这就是他们之间有桌子的原因。

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

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

2 个答案:

答案 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_artistn_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)
     )
)