我正在为一个销售音乐CD的网站创建一个数据库设计,但我碰壁了,因为我无法弄清楚CD和它的流派之间的关系是一对多还是多对多
每张CD可以有多个流派。例如,“音乐部的Dubstep赞美诗”可以有像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时执行联接?
发布于 2013-03-26 05:38:14
你是对的- CD和流派之间的关系是多对多的,这正是你提供的理由。
是的,像您所描述的交叉引用/连接表就是您所需要的。
有趣的是,根据其他约束,您可能也希望能够将流派放在其他地方。例如,歌曲:像Weird Al这样的艺术家可能会在他的一张专辑中放入几种不同类型的歌曲,而专辑本身并不一定有任何单一的“主要”类型(但通常有一些“主题”)。
发布于 2013-03-26 05:38:24
我想你已经回答了你自己的问题。CD和类型是多对多,您可以使用带有两个外键的两列表来实现,通常称为“连接表”。通常没有必要认为该表有一个主键,但合理地说,这两列是一个复合主键。
发布于 2013-03-26 05:50:46
要确定重数,请从不同的关系开始提出相同的问题:
当然,这可能是错误的数据库模型。相反,宋代<->流派和宋代<->CD是更高的规范化形式。它是更高的NF,因为CD <->流派可以由CD <->歌曲<->流派组成,但是CD<->流派不能回答关于CD上的歌曲的相同问题(除非一张CD最多只能是一个流派)。
另一方面,人们可能只关心CD而不关心歌曲。在这种情况下,对歌曲建模不相关甚至有害的过量数据。同样,完美的分类可能会使实际的分类过于复杂-要注意信息粒度和对问题域的使用之间的权衡。
https://stackoverflow.com/questions/15625245
复制相似问题