针对类似数据的规范化与非规范化数据库

时间:2016-04-03 22:08:29

标签: mysql database database-design normalization

我打算建立一个数据库,用于存储大量有关音乐的数据。 我将歌曲特定信息存储在db_song表中。 我还想存储流派乐器示例播放列表。 因为一首歌可以有多种类型,乐器,样本和播放列表,所以最大的问题是:

对于:

更有意义吗?
  1. 将所有这4个数据存储在单独的表中
  2. 将所有这4个数据存储在一个表中,并在单独的列中记录类型
  3. 数据库会经常更新,但用户会更频繁地请求数据。

    感谢您的帮助。

    编辑:

    正如Amit建议的那样,通过上面的设置,会有很多重复的数据。 如何在不同的表格中存储流派和乐器值以及播放列表标题,以及另外3个表格中的流派,乐器和播放列表关系(项目到歌曲)。

    所以新方案:

    1. 将所有这4个数据存储在单独的表中+ 4个以上的表来存储项目之间的关系
    2. 将所有这4个数据存储在一个表格中,并将类型记录在另一列中与歌曲分开的列+关系中

2 个答案:

答案 0 :(得分:0)

当您说“大量数据”时,您的意思是多少?几百万首歌曲和相关元数据不应对标准数据库设置造成任何实际性能问题。

我建议您使用4个或更多单独的表格来设计第3范式(3NF)中的数据库。使用非规范化结构(一个大表),行中将存在重复信息,并且与标准化结构相比,更新将更昂贵。

根据数据读取/分析的要求,如果要求是针对具有历史数据要求的复杂数据分析,则值得考虑在操作系统之上构建数据仓库。如果数据要求很简单(在这些表之间连接以获取特定歌曲,艺术家或流派的信息)那么规范化数据库应该能够很好地回答它们。

答案 1 :(得分:0)

“歌曲”可以包含0或1个或多个流派,乐器,样本和播放列表。因此,有少于5个表是有意义的。

此外,其中许多是“多对多”。例如,一个播放列表可以有很多歌曲;一首歌可以在很多播放列表中。要处理这种情况,你需要一个带有song_id和playlist_id的额外表来建立多对多的'关系'。

另一方面,“流派”是一组可能的十几种可能性 - “摇滚”,“古典”,......你可能不需要表格来表达类型。相反,每首歌曲(以及每个播放列表?)可以包括具有类型的ENUM或SET。拥有多对多映射(在这种情况下)是不值得的。

为了帮助充实架构,请考虑SELECTs必须看起来像什么。