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
所以我正在努力思考整个 "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