我正在为销售音乐CD的网站创建一个数据库设计,而且我已经碰壁了,因为我无法理解CD和它的类型之间的关系是否是一对一的。许多或多对多
每张CD都有多种类型。例如“声音Dubstep Anthems”可以有Dubstep,Dance和Electro等类型。
我想的越多,每种类型也可以链接到许多CD。
目前我拥有数据库的方式是:
cd_table
PK ID
FK Genre
Description
...
genre_table
PK ID
Genre
如果它是多对多的,我认为我需要一个连接表,例如:
cd_genre
CD_ID
Genre_ID
然后让他们都充当主键?我如何将cd_genre链接到cd_table?或者我只是删除CD_table中的FK,然后在查询CD时进行连接?
答案 0 :(得分:0)
你是对的 - CD和Genre 之间的关系是多对多的,这正是你提供的原因。
是的,您所描述的交叉引用/连接表就是您所需要的。
有趣的是,根据其他限制,您可能希望能够将类型放在其他地方。例如,歌曲:像Weird Al这样的艺术家可能会在他的一张专辑中放置几种不同类型的歌曲,而专辑本身并不一定有任何单一的“主要”类型(但通常会有一些'主题')
答案 1 :(得分:0)
我想你回答了自己的问题。 CD和流派是多对多的,你用两个列表和两个外键完成它,通常称为“连接表”。通常没有必要将该表视为具有主键,但合理地将两列组合在一起是复合主键。
答案 2 :(得分:0)
要确定多重性,请从不同的关系开始提出相同的问题:
当然,可能是错误的数据库模型。相反,Song< - > Genre和Song< - > CD是更高的标准化形式。它是较高的NF,因为CD - 类型可以由CD - Song - Genre组成,但是CD - 类型不能回答关于CD上的歌曲的相同查询(除非CD可以是最多一种类型。)
另一方面,人们可能只关心CD而不关心歌曲......在这种情况下,建模歌曲不相关甚至是有害的过度数据。同样,完美的分类可能会使实际分类过于复杂 - 要注意信息粒度与问题域使用之间的权衡。