我们有3张桌子: 1.艺术家2.专辑3.曲目
艺术家有一张或多张专辑。艺术家可以有摩尔斯曲目。每一张专辑都有许多曲目。
现在,如果一首歌不属于任何一张专辑,而是艺术家的一首歌,那该怎么办?那该怎么做呢?以及我们应该如何处理轨道表中的外键album_id。它可以是空的吗?
发布于 2017-03-15 16:56:08
您有3个表表示实体关系。这些将使您的实体集与它们的属性相关联。您的实体集之间的关系没有明确定义。每个Artist可以有许多Albums,但是每个Album可以有多少个Artists?每个Artist可以有许多Tracks,但是每个Track可以有多少个Artists?每个Album可以有多个Tracks,但是每个Track可以属于多少个Track?
在现实世界中,一首歌可以出现在许多专辑中,但是一首歌的每一首歌/一首歌的出现都可能被看作是一个不同的实体。我假设一个Track可以有很多Artists,但是Track只属于一个Album。此外,我假设我们不需要直接建模Albums和Artists之间的关联,而是可以使用每个相册中与Tracks关联的Artists的联合,这可以通过适当的查询获得。

这需要两种关系:
TrackArtist (TrackID PK/FK, ArtistID PK/FK)
TrackAlbum (TrackID PK/FK, AlbumID FK)如果希望允许Track和Album独立于Albums,则可以将Tracks和AlbumID之间的关系还原到Track实体关系/表中,作为一个可为空的AlbumID列。
如果您想要不同的关系基数,结果将看起来有些不同。如果您想直接记录Albums和Artists之间的关系,情况就会大不相同,您可能不得不考虑TrackArtist和AlbumArtist之间的一致性。
发布于 2017-03-14 22:31:22
当使用星型模式(维度和事实表)时,可以有一个带有“跟踪”纹理的事实表。所以每一行都是一个轨道。如果轨道没有相册,则相册的外键将设置为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发布于 2017-03-14 22:51:51
我建议做一张新桌子..。歌曲和使曲目表与外键链接表相册和歌曲。外键中的空值破坏了设计外键的目的。有关更多详细信息,请参阅钥匙。
https://stackoverflow.com/questions/42797585
复制相似问题