所以我试图围绕整个"规范化"事情。为了更好地理解它,我想出了一个存储歌曲的案例
假设我有以下数据库:
相册表
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
。那么,这将需要填写所有可能的组合,但这只会针对每个新类型引入一次。
另外,我想到的是,这将被视为"正常化"?从我看过的例子中,我还没有看到创建包含原始数据的列的表。
答案 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