1

我正在为一个销售音乐 CD 的网站创建数据库设计,但我遇到了难题,因为我无法弄清楚 CD 与其流派之间的关系是一对多还是多-太多

每张 CD 可以有多种流派。例如,“Ministry of Sound 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 时进行连接?

4

3 回答 3

0

要确定多重性,请从不同的关系开始提出相同的问题:

  1. 一张 CD 可以属于多个流派吗?
  2. 一个流派可以包含多张 CD 吗?

当然,这可能错误的数据库模型。相反,Song<->Genre 和 Song<->CD,是更高的规范化形式。这是一个更高的 NF,因为 CD<->Genre 可以由 CD<->Song<->Genre 组成,但 CD<->Genre 不能回答关于 CD 上歌曲的相同查询(除非一张 CD 最多可以是一个 Genre )。

另一方面,人们可能关心 CD 而不是歌曲 .. 在这种情况下,建模歌曲无关甚至有害的过多数据。同样,完美的分类可能会使实际分类过于复杂——注意信息粒度和问题域使用之间的权衡。

于 2013-03-25T21:50:46.297 回答
0

你是对的 - CD 和流派之间的关系多对多的,这正是你提供的原因。

是的,您所需要的就是您所描述的交叉引用/连接表。


有趣的是,根据其他限制,您可能也希望能够将流派放在其他地方。例如,歌曲:像Weird Al这样的艺术家可能会在他的一张专辑中放入几种不同类型的歌曲,而专辑本身不一定有任何单一的“主要”类型(但通常有一些“主题”)。

于 2013-03-25T21:38:14.447 回答
0

我想你回答了你自己的问题。CD 和流派是多对多的,您可以使用带有两个外键的两列表来完成它,通常称为“连接表”。通常没有必要将该表视为具有主键,但合理地讲,两列一起是复合主键。

于 2013-03-25T21:38:23.887 回答