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

DBMS - Music genre normalization in a database

所以我正在努力思考整个 "normalization" 事情。为了更好地理解它,我想出了一个存储歌曲的案例

假设我有以下数据库:

专辑Table:

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

为了归一化,我想到了下面的做法

专辑Table:

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

类型 Table:

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

因此,如果弹出一个新的流派,我需要做的就是在流派table中创建一个新的列,并分配新的对应的genre_id。好吧,这将需要填写所有可能的组合,但对于引入的每个新类型,这种情况只会发生一次。

Also, what I thought of, will that be considered "normalizing"? From the examples I have seen around, I haven't seen creation of tables with columns that were originally data.

这样做的规范方法是使用 three tables:

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

规范化就是避免重复数据的存储。如果仔细检查此设计,您会发现有关专辑和流派的信息仅存储一次,分别存储在 table 中。然后,AlbumGenre table 存储专辑和各种流派之间的关系。此 table 通常称为 "bridge" table,因为它将专辑与其流派联系起来。

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

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

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

专辑Table:

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

类型 Table:

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

现在我们需要 link 这两个。我们使用联结 table 来做到这一点。属于专辑的流派的每个实例都将在此 table 中占一行。因此相册可以多次在此 table 中列出。

专辑流派交汇点Table:

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