Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该改变我的MySQL数据库结构吗。_Mysql - Fatal编程技术网

我应该改变我的MySQL数据库结构吗。

我应该改变我的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

这是我当前的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 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))
);
按流派搜索名称时,按索引只会找到一个流派记录


此外,还可以直接检索电影的类型。

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

  • 通过实现引用完整性,将不可能为电影指定无效类型。在第一个选项中,可能会出现拼写错误(例如,
    Sience小说
    )。为了避免在第一个选项中发生这种情况,可以添加一个数据库约束以仅允许某些值,但列出这些值将非常接近于为其实际创建第三个表,并且稍后允许使用新类型将需要一个DML语句(而不是在第二个选项中使用一个简单的
    insert

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

  • 它占用更少的空间。数字外键值占用的空间小于类型文本字符串。诚然,这些字符串仍将存储在一个(单独的)表中,但每个类型仅存储一次。由于电影和相关电影类型表的记录通常比可能的不同类型的数量多,因此会增加空间。同样的道理也适用于你想在电影类型上创建的索引,因此一个列出某一类型电影的查询将高效运行。数字索引比文本字符串索引占用的空间更少

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


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

  • 通过实现引用完整性,将不可能为电影指定无效类型。在第一个选项中,可能会出现拼写错误(例如,
    Sience小说
    )。为了避免在第一个选项中发生这种情况,可以添加一个数据库约束以仅允许某些值,但列出这些值将非常接近于为其实际创建第三个表,并且稍后允许使用新类型将需要一个DML语句(而不是在第二个选项中使用一个简单的
    insert

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

  • 它占用更少的空间。数字外键值占用的空间小于类型文本字符串。诚然,这些字符串仍将存储在一个(单独的)表中,但每个类型仅存储一次。由于电影和相关电影类型表的记录通常比可能的不同类型的数量多,因此会增加空间。同样的道理也适用于你想在电影类型上创建的索引,因此一个列出某一类型电影的查询将高效运行。数字索引比文本字符串索引占用的空间更少

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


这是一种多对多的关系,所以最好有一个桥接表,以防您要查询超过1种类型的内容。我已经可以这样做了@digitFor me第二个是更好的选择。我已经知道,每个人都说,第二个更好。我想知道为什么?你必须为多对多关系做第二个DB结构。因为在第一个DB结构中,在类型表中有重复的类型名称值。您可以阅读数据库规范化,这是一种多对多关系,因此最好使用桥接表,以防您要对1种以上的类型执行查询。我已经可以这样做了@digitFor me第二个是更好的选择。我已经知道,每个人都说,第二个更好。我想知道为什么?你必须为多对多关系做第二个DB结构。因为在第一个DB结构中,在类型表中有重复的类型名称值。您可以阅读数据库规范化