3

私はデータベース設計が初めてなので、ご容赦ください。PHPとMySQLを使用しています。映画に関する詳細を含む「movies」テーブルがあります。これには、映画と多対多の関係がある (私の理解が正しければ) ジャンルが含まれます。つまり、1 つの映画が異なるジャンルに属し、1 つのジャンルが異なる映画に属する可能性があることを意味します。

データベース設計について私が収集したところによると、この種の関係を 1 つのテーブルに格納することは、第 1 正規形または第 2 正規形のルールに違反するため、お勧めできません。これを回避するには、テーブルをどのように設計すればよいでしょうか。ジャンルごとに個別にテーブルを作成する必要がありますか、それとも... ?

これは私の次の質問につながります。どの情報がどの行に属しているかを識別するために、個別のテーブルに外部キーが必要です。理論的には、各映画を識別する一意のキーがあり、それを使用して別のテーブルで監督を識別したい場合、MySQL でこの関係を作成するにはどうすればよいでしょうか?

お時間をいただきありがとうございます。不明な点がありましたらお知らせください。明確にするために最善を尽くします。

4

5 に答える 5

4

これには、映画と多対多の関係がある (私の理解が正しければ) ジャンルが含まれます。つまり、1 つの映画が異なるジャンルに属し、1 つのジャンルが異なる映画に属する可能性があることを意味します。

それは正しい。

データベース設計について私が収集したことによると、この種の関係を 1 つのテーブルに格納することはお勧めできません。

右。あなたはこれらの線に沿って大まかに何かを探しています.

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

監督の場合、映画ごとに監督が 1 人しかいないと仮定すると、上記の映画テーブルの代わりにこれを使用できます。

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
);
于 2012-08-14T12:54:45.993 に答える
2

ジャンクションテーブルを使用する必要がある/使用する必要がある

テーブルムービー:

| 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       |
于 2012-08-14T12:53:52.647 に答える
2

その通りです。ここで必要なのは、映画のテーブル (例: tbl_movies) です。

pk    id
      name
      ... etc

ジャンルの表 (例: tbl_genres);

pk    id
      name
      ... etc

および 2 つをリンクするテーブル (例: tbl_movie_genres)。

fk    id_movies
fk    id_genres

の pk をtbl_movie_geners2 つの外部キーに設定するか、スタンドアロンの pk を設定できます (たとえば、上記idtbl_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」は rom com であり、「映画 2」はアクション ホラーであることを示します。

于 2012-08-14T12:55:00.987 に答える
2

1 つのテーブル Movies、1 つのテーブル Genres、および 1 つのテーブル Movies_and_Genres が必要です。最初の 2 つには、mysql 自動インクリメント フィールド タイプを使用して作成できる一意の主キーが含まれています。3 番目のテーブルには、これらの主キーのペアが含まれています。

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 テーブルが必要です。それ以外の場合は、directors テーブルと、movies テーブルの director 列のみが必要です。

于 2012-08-14T12:51:38.010 に答える
1

多対多の関係を満たすには、映画テーブルとジャンル テーブルの両方への外部キーを保持する結合テーブルを使用します。

MOVIE
-----
ID (PK)

GENRE
-----
ID (PK)

MOVIE_GENRE
-----------
MOVIE_ID (FK that references MOVIE(ID))
GENRE_ID (FK that references GENRE(ID))

ここで、MOVIEテーブルには の主キーがありIDGENREテーブルには の主キーがIDあり、MOVIE_GENREテーブルには への 1 つと への 2 つの外部キー参照がMOVIE.IDありGENRE.IDます。の主キーは ( , )MOVIE_GENREの複合キーにすることができます。これは一意になるためですが、合成キーを使用することもできます。MOVIE_IDGENRE_ID

director テーブルと関係を処理する場合、それが 1 対多の関係 (多数の映画に対して 1 人の監督) の場合は、MOVIEテーブルに外部キーを追加するだけです。

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

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

別の多対多の関係 (多数の映画に多数の監督) をサポートする必要がある場合は、上記のような結合テーブル アプローチを使用します。

于 2012-08-14T13:04:06.640 に答える