艺术家专辑曲目的实体关系

时间:2017-03-14 22:16:12

标签: mysql sql rdbms

我们有3张桌子: 1.艺术家 2.专辑 3.曲目

艺术家有一个或多个专辑。 艺术家可以有更多的曲目。 每张专辑都有很多曲目。

现在,如果一首歌不属于任何一张专辑并且它是一首来自艺术家的歌曲,该怎么办?那么如何进入?以及我们应该如何处理Track表中的FOREIGN KEY album_id。可以为空吗?

3 个答案:

答案 0 :(得分:0)

使用星型模式(维度和事实表)时,您可以拥有一个带有" track"粒度的事实表。所以每一行都是一条轨道。如果曲目没有专辑,则专辑的外键将设置为0.

专辑表将有一行包含0键,其描述为"不可用"或短划线(' - ')或任何对您的报告目的有意义的内容。

您可以将其设为null,但如果您正在计算曲目,并且正在加入艺术家,则该行将不会返回,具体取决于您编写查询的方式。

示例查询:

select t.track_id, t.track_name, a.album_id, a.album_name, art.artist_id,art.artist_name 
from FACT_MUSIC_DB F 
JOIN DIM_TRACKS T ON T.TRACK_ID = F.TRACK_ID 
JOIN DIM_ALBUMS A ON A.ALBUM_ID = F.ALBUM_ID 
JOIN DIM_ARTISTS ART ON ART.ARTIST_ID = F.ARTIST_ID

Table setup example

答案 1 :(得分:0)

我建议制作一张新表...歌曲,并使曲目表成为一个链接表,其中包含用于专辑和歌曲的外键。在外键中具有空值会破坏外键的设计目的。有关详细信息,请参阅https://en.wikipedia.org/wiki/Foreign_key

答案 2 :(得分:0)

您有3个表代表实体关系。这些会将您的实体集与其属性相关联。您的实体集之间的关系没有明确定义。每个Artist可以有多个Albums,但每个Artists可以有多少Album?每个Artist可以有多个Tracks,但每个Artists可以有多少Track?每个Album可以有多个Tracks,但每个Albums可以有多少Track

在现实世界中,一首歌可以出现在许多专辑中,但每首歌曲的歌曲/外观可能被视为一个独特的实体。我将假设Track可以有多个Artists,但Track只属于一个Album。另外,我假设我们不需要直接对AlbumsArtists之间的关联进行建模,而是可以使用与Artists相关联的Tracks的并集。在每张专辑中,可以通过合适的查询轻松获得。

Track-Album-Artist ERD

这需要两种关系关系:

TrackArtist (TrackID PK/FK, ArtistID PK/FK)
TrackAlbum (TrackID PK/FK, AlbumID FK)

TrackAlbum之间的关系可以被归一化到Track实体关系/表中,如果您想允许AlbumID,则可以作为可空Tracks列。独立于Albums存在。

如果您想要关系的不同基数,结果会有所不同。如果您想直接记录AlbumsArtists之间的关系,情况会有所不同,您可能需要考虑TrackArtistAlbumArtist之间的一致性。