我们有3张桌子: 1.艺术家 2.专辑 3.曲目
艺术家有一个或多个专辑。 艺术家可以有更多的曲目。 每张专辑都有很多曲目。
现在,如果一首歌不属于任何一张专辑并且它是一首来自艺术家的歌曲,该怎么办?那么如何进入?以及我们应该如何处理Track表中的FOREIGN KEY album_id。可以为空吗?
答案 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
答案 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
。另外,我假设我们不需要直接对Albums
和Artists
之间的关联进行建模,而是可以使用与Artists
相关联的Tracks
的并集。在每张专辑中,可以通过合适的查询轻松获得。
这需要两种关系关系:
TrackArtist (TrackID PK/FK, ArtistID PK/FK)
TrackAlbum (TrackID PK/FK, AlbumID FK)
Track
和Album
之间的关系可以被归一化到Track
实体关系/表中,如果您想允许AlbumID
,则可以作为可空Tracks
列。独立于Albums
存在。
如果您想要关系的不同基数,结果会有所不同。如果您想直接记录Albums
和Artists
之间的关系,情况会有所不同,您可能需要考虑TrackArtist
和AlbumArtist
之间的一致性。