DBMS - 数据库中的音乐流派规范化

时间:2018-04-08 03:52:06

标签: database rdbms database-normalization

所以我试图围绕整个"规范化"事情。为了更好地理解它,我想出了一个存储歌曲的案例

假设我有以下数据库:

相册表

album_name| genre           
   album_1| genre_1, genre_2
   album_2| genre_1
   album_3| genre_2

为了规范化,我想到了以下方法

相册表

album_name| genre_id          
   album_1|        3
   album_2|        1
   album_3|        2

流派表:

genre_id| genre_1| genre_2
       0|   false|   false
       1|    true|   false
       2|   false|    true
       3|    true|    true 

因此,如果弹出一个新类型,我需要做的就是在流派表中创建一个新列,并且可以分配新的相应genre_id。那么,这将需要填写所有可能的组合,但这只会针对每个新类型引入一次。

  

另外,我想到的是,这将被视为"正常化"?从我看过的例子中,我还没有看到创建包含原始数据的列的表。

2 个答案:

答案 0 :(得分:5)

这样做的规范方法是使用三个表:

Album    | 
album_id | album_name  (and maybe other columns)
1        | Rumours
2        | Thriller
3        | To the Moon and Back

Genre
genre_id | genre_name  (also maybe other columns)
1        | rock
2        | pop
3        | alternative

AlbumGenre
album_id | genre_id
1        | 1
1        | 2
2        | 2
3        | 2
3        | 3

规范化就是避免重复数据的存储。如果您仔细检查此设计,您将看到有关专辑和流派的信息仅存储在每个相应的表格中一次。然后,AlbumGenre表存储专辑和各种类型之间的关系。这个表通常被称为" bridge" table,因为它将专辑链接到他们的流派。

您提议的Genre表的问题在于,即使这些关系不存在,它也会重复有关关系的信息。此外,如果您需要向数据库添加更多类型,这种方法根本无法很好地扩展。

答案 1 :(得分:1)

您定义的关系是多对多的关系。通常,您不希望在添加新数据时添加新列。所以我们需要看看另一种解决方案。

首先我们为专辑和流派定义表格:

相册表

album_id | album_name           
       1 |    album_1
       2 |    album_2
       3 |    album_3

流派表:

genre_id | genre_name
       1 |    genre_1
       2 |    genre_2
       3 |    genre_3 

现在我们需要将这两者联系起来。我们使用联结表来做到这一点。属于专辑的每个类型的实例在该表中都有一行。所以专辑可以多次列在这张表中。

专辑类型结表:

album_genre_junction_id | album_id | genre_id
                      1          1          1
                      2          1          2
                      3          2          1
                      4          3          2