我是数据库设计的新手,所以请耐心等待。我正在使用PHP和MySQL。我有一个"电影"表,其中包含有关电影的一些详细信息。这包括流派,它们与电影有(如果我理解正确的话)多对多的关系,这意味着一部电影可以属于不同的流派,而单一流派可以属于不同的电影。
从我收集的有关数据库设计的信息来看,将这种关系存储在一个表中不是一个好主意,因为它会违反第一范式或第二范式规则。我将如何设计我的表格来避免这种情况;我是否必须为每个流派单独创建一个表格或...?
这就引出了我的下一个问题:单独的表需要有外键来标识哪些信息属于哪一行。从理论上讲,如果我有一个标识每部电影的唯一键,然后我想用它来识别一个单独的表中的导演,我将如何在MySQL中创建这种关系?
感谢您抽出宝贵时间 - 如果我有任何不清楚的地方,请告诉我,我会尽力澄清。
这包括流派,它们有一个(如果我理解正确的话)很多 对于许多与电影的关系,暗示一部电影可以属于 属于不同的流派,单一流派可以属于不同的电影。
没错。
从我收集的有关数据库设计的信息来看,存储这种 一个表中的关系不是一个好主意
右。你正在寻找一些松散的东西。
create table movies (
movie_id integer primary key
-- other columns
);
create table genres (
genre varchar(15) primary key
-- other columns?
);
create table movie_genres (
movie_id integer not null,
genre varchar(15) not null,
primary key (movie_id, genre),
foreign key (movie_id) references movies (movie_id),
foreign key (genre) references genres (genre)
);
对于导演,假设每部电影只有一个导演,你可以使用它代替上面的电影表。
create table movies (
movie_id integer primary key,
director_id integer not null,
foreign key (director_id) references directors (director_id) -- not shown.
-- other columns
);
您需要一个表电影,一个表流派和一个表Movies_and_Genres。前两个包含唯一的主键,您可以使用 mysql 自动增量字段类型创建这些主键。第三个表包含这些主键对。
create table movies (id integer not null primary key auto_increment, title ... );
create table genres (id integer not null primary key auto_increment, genre ... );
create table movies_and_genres (id_movie integer not null, id_genre integer not null);
至于导演,这是一个数据建模的问题。如果一部电影可以有多个导演,那么你需要一个导演和一个movies_and_directors表。否则,您只需要"导演"表和"电影"表中的"导演"列。
您需要/应该使用连接表
餐桌电影:
| id | title | rating |
-----------------------
| 1 | foo | 5 |
| 2 | bar | 4 |
表类型:
| id | name |
----------------
| 1 | comedy |
| 2 | romance |
表主任:
| id | name |
----------------
| 1 | hello |
| 2 | world |
表 movie_genre:
| id | movie_id | genre_id |
----------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
表 movie_director:
| id | movie_id | director_id |
-------------------------------
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 2 | 2 |
你说得很对,这里你需要的是有一个电影表(例如 tbl_movies
);
pk id
name
... etc
流派表(例如tbl_genres
);
pk id
name
... etc
以及连接两者的表格(例如tbl_movie_genres
);
fk id_movies
fk id_genres
您可以将tbl_movie_geners
的 pk 设置为两个外键,也可以设置一个独立的 pk(例如id
如上面的tbl_movies
和tbl_genres
表中)。
通过这种方式,您可以列出每部电影的任意数量的流派,并且它们通过tbl_movie_genres
表链接; 例如:
tbl_movies:
id name
1 Movie 1
2 Movie 2
tbl_genres:
id name
1 Horror
2 Action
3 Rom Com
tbl_movie_genres
id_movies id_genres
1 3
2 1
2 2
会告诉你"电影1"是浪漫喜剧,"电影2"是动作恐怖片。
若要满足多对多关系,请使用一个连接表,该表包含电影和流派表的外键:
MOVIE
-----
ID (PK)
GENRE
-----
ID (PK)
MOVIE_GENRE
-----------
MOVIE_ID (FK that references MOVIE(ID))
GENRE_ID (FK that references GENRE(ID))
这里MOVIE
表的主键是ID
,GENRE
表的主键是ID
,MOVIE_GENRE
表有两个外键引用:一个到MOVIE.ID
,另一个到GENRE.ID
。 MOVIE_GENRE
的主键可以是(MOVIE_ID
,GENRE_ID
)的组合键,因为它是唯一的,但您也可以使用合成键。
对于处理导演表和关系,如果是一对多关系(一个导演用于许多电影),只需在MOVIE
表中添加一个外键:
DIRECTOR
--------
ID (PK)
MOVIE
-----
ID (PK)
DIRECTOR_ID (FK TO DIRECTOR(ID))
如果您需要支持另一种多对多关系(许多电影的许多导演),请使用如上所述的连接表方法。