2010-04-09 53 views
1

我有关于规范化的问题。 假设我有一个处理歌曲的应用程序。mySQL和通用数据库规范化问题

首先,我想过做这样的:

Songs Table: 
id | song_title | album_id | publisher_id | artist_id 

Albums Table: 
id | album_title | etc... 

Publishers Table: 
id | publisher_name | etc... 

Artists Tale: 
id | artist_name | etc... 

然后我想正常化的东西。我想我应该摆脱“album_id,PUBLISHER_ID和artist_id在歌曲表,并把他们在这样的中间表。

Table song_album: 
song_id, album_id 

Table song_publisher 
song_id, publisher_id 

Table song_artist 
song_id, artist_id 

现在我不能决定哪个是更好的办法。我不是在数据库设计专家,所以如果有人想指出正确的方向。它会真棒。

是否有任何性能问题两种方法之间?

感谢

回答

3

忘掉性能问题。问题是这个模型是否正确表示数据?

中间表称为“联结表”,它们在您可以具有多对多关系时非常有用。例如,如果您将歌曲“我们是世界”存储在您的数据库中,那么您将拥有该歌曲的许多艺术家。这些艺术家中的每一个也都负责制作许多其他歌曲。因此,为了正确表示数据,您必须使用联结表,就像您在第二个版本中所做的那样。

2

那要看情况。如果你能保证是某个特定歌曲总是属于单一专辑,去你的第一个方法。如果没有,你有n对n的关系,需要一个连接表:这是你的第二种方法。就规范化而言,两者都完全没问题。

设计数据库非常重要,您可以将数据映射到该数据库。

不要担心这里的表现。性能更多依赖于如何优化索引以及查询的样子,而不是必须再进行一次连接操作(您的第二种方法即连接表在每个查询中需要多一次连接)。

-3

我会坚持与第一个,有两个原因:

  1. 一首歌曲只用了一张专辑,一个出版商,一个艺术家相关联,因此您无需为他们创造不同的表(例如,如果一首歌曲可以有多个艺术家,则创建song_artist表格)。
  2. 它更有效率。采用第二种方法,您需要进行一些连接。
+0

只是出于好奇,为什么-1? – yassin 2010-04-09 20:58:44

0

歌曲可以出现在多个相册中。认为一个最大的命中版本。对于缩小技术漏洞并考虑应用程序(或数据库)的真实世界使用而言,它非常重要。

+1

取决于设计。一个可能的设计决定可能是不让歌曲出现在多个专辑中,出于某些原因......也许这首歌是重新安装在最大的热门版本上,而你不想将它与原版相关联。也许你想忽略_really_出现在不同专辑上的那几首歌曲?重要的是:在设计时,必须在使用数据库之前考虑这些事情。 – 2010-04-09 15:47:15

1

第一种结构混合了语义(例如,为每首单曲写出发行者姓名)。第二种结构将允许您将无效数据放入数据库中(例如,一首歌曲可以属于两个专辑)。以下是我从问题域的理解和我的设计建议:

一个专辑仅由一个出版商出版,因此你不需要在每一个歌曲只需指定发布者,你需要将publisher_ID放入相册表。另外,如果您将artist_ID保存在歌曲表中,则每首歌曲一次只能有一个歌手;但通过将song_IDartist_ID放在链接表中,您可以为一首歌曲创建多个艺术家(例如两个歌手一起唱一首歌曲的时间)。 publisher_id转到专辑表由于每个专辑由一个发布者发布。 对于表名,总是建议使用单数形式。

这里是我的设计建议:

Song Table: 
id | song_title | album_id | ... 

Album Table: 
id | album_title | publisher_id | ... 

Publisher Table: 
id | publisher_name | ... 

Artist Table: 
id | artist_name | ... 

Song_Artist Table: 
song_id | artist_id | artist_role | ...