2017-08-06 58 views
0

这是我目前的Mysql结构。我应该改变我的MySQL数据库结构吗?

2表:

1.) Movies 
2.) Genres 

两个表是由一个名为movie_id柱相连。

这是我的表结构的一个例子:


Movies

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   movie_name 

1     Superman 
2     Logan 
3     The Hangover 
4     8 Mile 
5     The Dark Knight 

表: Genres_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_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 

我目前使用的是第一个数据库结构。但是,我应该改变它到第二个吗?但是优点是什么?更好的速度? (我真的需要它)

让我知道,如果你需要更多的信息,谢谢。

+0

这是多对多的关系,所以如果您想要执行超过1种流派的查询,最好有桥表。 – digit

+0

我已经可以做到@digit – Toby

+0

对我而言,第二个是更好的选择。 – digit

回答

4

第二数据库结构具有以下优点:

  • 通过实施参照完整性,这将是不可能的无效流派分配给影片。在第一个选项中可能会出现拼写错误(例如Sience Fiction)。为了避免在第一个选项中出现这种情况,可以添加一个数据库约束来仅允许某些值,但列出这些将非常接近实际为其创建第三个表,并且稍后允许新类型将需要DML声明(而不是第二个选项中的简单insert)。

  • 当电影数据有限,并且仍然存在未插入电影记录的流派时,用户不知道哪些流派可用,因为他们只是没有被存储。在第一个选项中,它们可以作为约束值出现,但没有SQL标准可从数据库字典中检索这些值。在实践中,您只需在应用程序语言中复制这些知识,并在那里定义一个可能值的封闭数组。但那只是将数据责任从数据库中转移出去。

  • 占用更少的空间。数字外键值比类型文本字符串占用更少的空间。无可否认,这些字符串仍将存储在(单独的)表格中,但每种类型只能存储一次。由于电影和相关的电影人表格通常会有比不同类型的数量更多的记录,因此会有空间增益。对于想要在流派中创建的索引也是如此,因此用于列出某种类型的电影的查询将有效地运行。数字索引所占空间小于文本字符串索引。

  • 列出所有流派的查询将更高效地运行。这是一种常见的用例,例如,当您需要为用户填充下拉列表框来选择流派时。

1

检查这一点:

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)) 
); 

按流派的名称的搜索通过索引查找只有一个流派记录。

此外,以直接方式检索电影的流派。

相关问题