我应该改变我的MySQL数据库结构吗。
这是我当前的Mysql结构 2个表:我应该改变我的MySQL数据库结构吗。,mysql,Mysql,这是我当前的Mysql结构 2个表: 1.) Movies 2.) Genres 两个表都由名为movie\u id的列连接 下面是我的表格结构的一个示例: 表格:电影 movie_id movie_name 1 Superman 2 Logan 3 The Hangover 4 8 Mile 5 The Dark
1.) Movies
2.) Genres
两个表都由名为movie\u id
的列连接
下面是我的表格结构的一个示例:
表格:
电影
movie_id movie_name
1 Superman
2 Logan
3 The Hangover
4 8 Mile
5 The Dark Knight
表格体裁
movie_id genres_name
1 Science Fiction
1 Action
1 Fantasy
1 Adventure
2 Action
2 Drama
2 Science Fiction
3 Comedy
4 Music
4 Drama
5 Crime
5 Thriller
5 Action
5 Drama
movie_id genres_id
1 1
1 2
1 3
1 4
2 2
2 5
2 1
3 6
4 7
4 5
5 9
5 8
5 2
5 5
现在很多人建议我将我的表结构更改为: 表格:电影
movie_id movie_name
1 Superman
2 Logan
3 The Hangover
4 8 Mile
5 The Dark Knight
表格:类型id
genres_id genres_name
1 Science Fiction
2 Action
3 Fantasy
4 Adventure
5 Drama
6 Comedy
7 Music
8 Thriller
9 Crime
表格体裁
movie_id genres_name
1 Science Fiction
1 Action
1 Fantasy
1 Adventure
2 Action
2 Drama
2 Science Fiction
3 Comedy
4 Music
4 Drama
5 Crime
5 Thriller
5 Action
5 Drama
movie_id genres_id
1 1
1 2
1 3
1 4
2 2
2 5
2 1
3 6
4 7
4 5
5 9
5 8
5 2
5 5
我目前正在使用第一个数据库结构。但是我应该换成第二个吗?但好处是什么呢?更快?(我真的需要它)
如果您需要更多信息,请告诉我,谢谢。检查以下内容:
CREATE TABLE Movies (
movie_id INT AUTO_INCREMENT PRIMARY KEY,
movie_name VARCHAR(255) NOT NULL,
UNIQUE KEY ix_movie_name (movie_name));
CREATE TABLE Genres (
genre_id INT AUTO_INCREMENT PRIMARY KEY,
genre_name VARCHAR(255) NOT NULL.
UNIQUE KEY ix_genre_name (genre_name));
CREATE TABLE Movie_Genres (
movie_id INT NOT NULL,
genre_id INT NOT NULL,
PRIMARY KEY (movie_id, genre_id),
FOREIGN KEY (movie_id) REFERENCES Movies(movie_id),
FOREIGN KEY (genre_id) REFERENCES Genres(genre_id))
);
按流派搜索名称时,按索引只会找到一个流派记录
此外,还可以直接检索电影的类型。检查以下内容:
CREATE TABLE Movies (
movie_id INT AUTO_INCREMENT PRIMARY KEY,
movie_name VARCHAR(255) NOT NULL,
UNIQUE KEY ix_movie_name (movie_name));
CREATE TABLE Genres (
genre_id INT AUTO_INCREMENT PRIMARY KEY,
genre_name VARCHAR(255) NOT NULL.
UNIQUE KEY ix_genre_name (genre_name));
CREATE TABLE Movie_Genres (
movie_id INT NOT NULL,
genre_id INT NOT NULL,
PRIMARY KEY (movie_id, genre_id),
FOREIGN KEY (movie_id) REFERENCES Movies(movie_id),
FOREIGN KEY (genre_id) REFERENCES Genres(genre_id))
);
按流派搜索名称时,按索引只会找到一个流派记录
此外,还可以直接检索电影的类型。第二种数据库结构具有以下优点:
- 通过实现引用完整性,将不可能为电影指定无效类型。在第一个选项中,可能会出现拼写错误(例如,
)。为了避免在第一个选项中发生这种情况,可以添加一个数据库约束以仅允许某些值,但列出这些值将非常接近于为其实际创建第三个表,并且稍后允许使用新类型将需要一个DML语句(而不是在第二个选项中使用一个简单的Sience小说
)insert
- 当电影数据是有限的,并且仍然存在没有插入电影记录的类型时,用户不容易知道哪些类型可用,因为它们只是没有存储。在第一个选项中,它们可以作为约束值出现,但是没有从数据库字典中检索这些约束值的SQL标准。实际上,您只需在应用程序语言中复制这些知识,并在其中定义一个可能值的封闭数组。但这只是将数据责任从数据库转移出去
- 它占用更少的空间。数字外键值占用的空间小于类型文本字符串。诚然,这些字符串仍将存储在一个(单独的)表中,但每个类型仅存储一次。由于电影和相关电影类型表的记录通常比可能的不同类型的数量多,因此会增加空间。同样的道理也适用于你想在电影类型上创建的索引,因此一个列出某一类型电影的查询将高效运行。数字索引比文本字符串索引占用的空间更少
- 列出所有类型的查询将更高效地运行。这是一个常见的用例,例如,当您需要填充下拉列表框以供用户选择流派时
- 通过实现引用完整性,将不可能为电影指定无效类型。在第一个选项中,可能会出现拼写错误(例如,
)。为了避免在第一个选项中发生这种情况,可以添加一个数据库约束以仅允许某些值,但列出这些值将非常接近于为其实际创建第三个表,并且稍后允许使用新类型将需要一个DML语句(而不是在第二个选项中使用一个简单的Sience小说
)insert
- 当电影数据是有限的,并且仍然存在没有插入电影记录的类型时,用户不容易知道哪些类型可用,因为它们只是没有存储。在第一个选项中,它们可以作为约束值出现,但是没有从数据库字典中检索这些约束值的SQL标准。实际上,您只需在应用程序语言中复制这些知识,并在其中定义一个可能值的封闭数组。但这只是将数据责任从数据库转移出去
- 它占用更少的空间。数字外键值占用的空间小于类型文本字符串。诚然,这些字符串仍将存储在一个(单独的)表中,但每个类型仅存储一次。由于电影和相关电影类型表的记录通常比可能的不同类型的数量多,因此会增加空间。同样的道理也适用于你想在电影类型上创建的索引,因此一个列出某一类型电影的查询将高效运行。数字索引比文本字符串索引占用的空间更少
- 列出所有类型的查询将更高效地运行。这是一个常见的用例,例如,当您需要填充下拉列表框以供用户选择流派时