SQL Server:多对多关系

时间:2010-11-29 23:22:20

标签: sql sql-server many-to-many

所以当我想要解决这个问题时,我正在脑子里崩溃。我所拥有的是一些数据库:

tblGenre

genreID
genreName

tblArtist

artistID
artistName
genreID

tblAlbum

albumID
albumName
artistID

一切都很好,工作得很好。好的,现在问题......

我想弄清楚的是如何链接一个有多个名字的艺术家。即艺术家'王子'。我有他的专辑,我将在3个不同的乐队下进行编目; Prince(artistID = 5),Prince和新一代(artistID = 17,“Symbol”(artistID = 43)......

所以,当我查找艺术家ID为5的艺术家“Prince”时,如何将其他2个乐队链接到这个?我是否会创建一个单独的数据库,其中包含每个artistID的逗号分隔值(即5,17,43),还是有更简单的方法来执行此操作?

我不想进入专辑级别,在我的数据库中的每张专辑中播放谁。我只想创建一个有多个乐队的艺术家链接。还有一些我想要“迷上”的例子......

  • Tom Petty(经典摇滚)

    • Tom Petty&撕心裂肺(经典摇滚)
    • Tom Petty&撕心裂肺(原声带)
  • 王子(Funk)

    • Prince&新发电(Funk)
  • Mark Knopfler(经典摇滚)

    • Mark Knopfler(原声带)
    • Dire Straits(经典摇滚)

感谢您的投入。

3 个答案:

答案 0 :(得分:3)

您有两种选择:

1)ARTISTS表和ARTISTS_ALIASES表,其中artistid是ARTISTS_ALIASES表中的外键,你的ALBUM表中会有一个artist_aliasid,所以你知道艺术家在该专辑中出现的名称;或

2)使用递归的单个ARTISTS(如EMPLOYEE BOSS表):

                artistid
                artistname
                primaryartistid  (references artistid in this table

当artistid和primaryartistid相同时,您将该行视为“基础”艺术家。

答案 1 :(得分:0)

我会创建一个像 tblRelatedArtists 这样的表,它有两列:.artistID和.relatedArtistID。

当您查询数据库时,您可以内部加入 tblArtist where .artistID is in (select relatedArtistID from tblRelatedArtists as innerArtists where innerArtists.artistID = outerArtists.artistID)

答案 2 :(得分:0)

Drew,听起来tblArtist比专辑的主要演员更多乐队。我看到你在问题中列出了vb,所以我也假设你在这个应用程序上有一个vb前端。有了所有这些假设,我建议你在tblArtist中添加一个名为altArtistId的varchar列。将此列添加到前端的重新记录集中。解析逗号分隔列表并返回到tblArtist以获取任何相关信息。