2012-08-14 53 views
3

我是數據庫設計的新手,請耐心等待。我使用PHP和MySQL。 我有一個'電影'表,其中包含一些關於電影的細節。這包括類型,其具有(如果我理解正確的話)與電影的多對多關係,暗示單個電影可以屬於不同類型,並且單個類型可以屬於不同電影。數據庫設計:外鍵和規範化

從我收集的數據庫設計中,將這種關係存儲在一張表中並不是一個好主意,因爲它會違反First Normal形式或Second Normal形式規則。 我會如何設計我的桌子來避免這種情況;我需要爲每個流派分別創建一張桌面還是......?

這導致我到我的下一個問題:單獨的表需要有外鍵來標識哪些信息屬於哪一行。從理論上講,如果我有一個唯一的關鍵字來標識每部電影,然後我想用它來在一張單獨的表中標識一個導演,那麼我將如何在MySQL中創建這種關係?

謝謝你的時間 - 如果我有什麼不清楚的地方,請讓我知道,我會盡我所能來澄清。

回答

4

這包括流派,其具有(如果我理解正確)許多 一對多的關係與電影,暗示一部電影可能屬於 以不同的流派和單一的流派可以屬於不同的電影。

沒錯。

從我收集有關數據庫設計,存儲這種 關係中一個表是不是一個好主意

權。你正在尋找鬆散的東西沿着這些線。

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

非常感謝您提供了非常全面的答案,特別感謝您解答外鍵問題。 – styke 2012-08-14 13:03:05

2

您需要一張表電影,一張表流派和一張表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表格。否則,您只需要電影表中的導演表和導演列。

2

你需要/應該使用junction tables

電影:

| 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  | 
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_moviestbl_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'是一個rom com,'電影2'是一個動作恐怖。

1

爲了滿足多對多的關係,使用連接表中包含外鍵都在電影和流派表:

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表有主鍵IDMOVIE_GENRE表有兩個外鍵引用:一個到MOVIE.ID,另一個到GENRE.IDMOVIE_GENRE的主鍵可以是(MOVIE_ID,GENRE_ID)的組合鍵,因爲這將是唯一的,但您也可以使用合成鍵。

對於與導演表和關係處理,如果是一個一對多的關係(多部電影有一個董事),只需添加一個外鍵MOVIE表:

DIRECTOR 
-------- 
ID (PK) 

MOVIE 
----- 
ID (PK) 
DIRECTOR_ID (FK TO DIRECTOR(ID)) 

如果即使你需要支持另一個多對多的關係(許多導演對許多電影),使用上面的連接表方法。