2009-04-11 10 views
0

私はmovieID、personID、roleの3つの列を持つ 'movie2person'というテーブルを持っています。私はこのテーブルを使って 'movies'テーブルと 'persons'テーブルとの間を接続します。多対多の関係..MySQLデータベースを設計するには

movieIDとpersonIDの両方を主キーとして選択しました... 問題は時には同じmovieIDの同じpersonIDを何度も入力する必要があり、同じmovieIDとpersonIDの1つの組み合わせのみが許可されているため、私はそれを行うことができません...

どうすればいいですか?

おかげで..

答えて

2

のどちらかが主キーでの役割を含め、またはテーブルに新しい人工キーを追加し、この表の外で使用することはありません主キーとして、この新しい列を使用しています。

+0

プライマリキーとして多くの情報(ロール)を持つ3つの列を持つことは、パフォーマンスに影響しませんか? – Jonathan

+0

ロールが大きな列の場合は、代わりに人工キーを使用します。自動増分された整数である必要があります。次に、一意性が必要な場合は、残りの列に制約を定義できます。 – Welbog

+0

roleはVARCHAR 80ですが、私はmovieIDとpersonIDがプライマリである必要がありますので、別のテーブルから参照することができます。 – Jonathan

0

主キーとは、「これはこの行の一意の識別子です」を意味します。

同じ値を持つ多くの行を挿入する場合、それは主キーではありません。

行に正確な重複を挿入する予定がある場合、主キーはまったく持っていないので、それを削除する必要があります。

ただし、各(movieID、personID)のペアに異なる役割を挿入する予定がある場合は、その役割を主キーに追加するだけでよいのです。

+0

主キーとして多くの情報(役割)を持つ3つの列を持つことは、パフォーマンスに影響しませんか? – Jonathan

+0

ちょうどあなたはロールに何を保存していますか?そのデータ型は何ですか? – Welbog

0

3つの列すべてを主キーとして使用します。

0

は、私はあなたのデザインにいくつかの変更を示唆しています:

  1. 変更MoviePerson_xrefへMovie2Personからあなたのテーブルの名前を。通常、このような形式で名前を付け、テーブル命名規則から数値を除外することは標準的です。

  2. このテーブルには、movieperson_xrefIDという独自のプライマリキーが必要です。

  3. ムービーIDと個人IDのすべての組み合わせを保存できます。

1

あなたが作成したいくつかのコメントに基づいて、より多くの正規化が必要だと思います。ロールテーブルを作成し、それに従ってルックアップテーブルを調整する

movie 
+----+------------+ 
| id | title  | 
+----+------------+ 
| 1 | Braveheart | 
+----+------------+ 

person 
+----+------------+ 
| id | name  | 
+----+------------+ 
| 4 | Mel Gibson | 
+----+------------+ 

role 
+----+------------+ 
| id | title  | 
+----+------------+ 
| 1 | Director | 
| 2 | Actor  | 
+----+------------+ 

movie2person 
+---------+----------+--------+ 
| movieID | personID | roleID | 
+---------+----------+--------+ 
|  1 |  4 |  1 | 
|  1 |  4 |  2 | 
+---------+----------+--------+ 

この設定では、movie2personに3列の複合主キーがあります。

+0

役割は単に役割のタイトルではなく、俳優が映画内で演じる人物です。例えば、グラディエーターのRusell Croweの役割はMaximusですので、フィールドは常にユニークなのでロールテーブルは必要ありません – Jonathan

関連する問題