问题描述
这是(我认为)一个通用问题,但这里有一个具体的例子。 假设:
-
Albums
每个都有 1-n 个Tracks
。 - 每个
Track
都在一个Album
中。 (即使“Logging with the Bloggs”同时出现在Bloggs 的第一张专辑 和Bloggs 的精选集中,对于我来说,这也是 2 个实体目的。) - 每个
Track
正好有一个Artist
。 -
Artists
有 1-nTracks
。 - 每个
Album
有 1 个Album_Artist
。 (其中所有Tracks
均来自 Bloggs,Album_Artist
为 Bloggs。其中Tracks
来自不同的艺术家,如伟大的日志歌曲集,Album_Artist
是各种。
我希望能够回答以下问题:
那么最好的表模型是什么?
目前我有一个 Artists
表,其中有一个 Isalbumartist 的布尔列?
然后 Tracks
有一个外键 Artist_id 和一个外键 Album_id 。
并且 Albums
有一个外键 Artist_id
但是最好有一个单独的 albumartists
表,还是现在考虑表继承?
感谢您提供任何设计信息和提示!
解决方法
-- Artist ART exists.
--
artist {ART}
PK {ART}
-- Make sure to add "Various" to the list of artists.
-- Album ALB by album-artist ART exists.
--
album {ALB,ART}
PK {ALB}
FK1 {ART} REFERENCES artist {ART}
-- Track number TR_NO of album ALB
-- performed by artist ART is named TR_TITLE.
--
track {ALB,TR_NO,ART,TR_TITLE}
PK {ALB,TR_NO}
AK {ALB,TR_TITLE}
FK1 {ALB} REFERENCES album {ALB}
FK2 {ART} REFERENCES artist {ART}
-- List all the Bloggs albums
--
SELECT ALB
FROM album
WHERE ART = 'Bloggs' ;
-- Find all the Bloggs tracks
-- with 'logging' in the title.
--
SELECT ALB,TR_TITLE
FROM track
WHERE ART = 'Bloggs'
AND TR_TITLE like '%logging%' ;
-- List all the album-artists
--
SELECT ART
FROM album ;
注意:
All attributes (columns) NOT NULL
PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key
这是一个简化的逻辑设计,将其用作概念证明。要为 PKs
使用(添加)整数或代码,请查看 this example。