36

Microsoft SQL Server Management Studio を使用していますが、ジャンクション テーブルの作成中に、ジャンクション テーブルの ID 列を作成する必要がありますか? その場合、それを主キーと ID 列にする必要がありますか? または、多対多の関係で結合しているテーブルに 2 つの列を保持するだけですか?

たとえば、これが多対多テーブルの場合:

MOVIE
Movie_ID
Name
etc...

CATEGORY
Category_ID
Name
etc...

ジャンクションテーブルを作成する必要があります:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID
Movie_Category_Junction_ID

[そして、Movie_Category_Junction_ID私の主キーを作成し、ID 列として使用します] ?

または:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID

[そして、主キーまたはIDテーブルなしでそのままにしておく] ?

4

3 に答える 3

68

I would use the second junction table:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID

The primary key would be the combination of both columns. You would also have a foreign key from each column to the Movie and Category table.

The junction table would look similar to this:

create table movie_category_junction
(
  movie_id int,
  category_id int,
  CONSTRAINT movie_cat_pk PRIMARY KEY (movie_id, category_id),
  CONSTRAINT FK_movie 
      FOREIGN KEY (movie_id) REFERENCES movie (movie_id),
  CONSTRAINT FK_category 
      FOREIGN KEY (category_id) REFERENCES category (category_id)
);

See SQL Fiddle with Demo.

Using these two fields as the PRIMARY KEY will prevent duplicate movie/category combinations from being added to the table.

于 2013-02-03T19:32:42.703 に答える
22

これについてはさまざまな考え方があります。ある学校では、リンクしている 2 つのテーブルだけでなく、主キーを含め、リンク テーブルに何か意味のある名前を付けることを好みます。その理由は、テーブルは最初は単なるリンク テーブルのように見えるかもしれませんが、重要なデータを含む独自のテーブルになる可能性があるからです。

例として、雑誌と購読者の間の多対多があります。本当にそのリンクは、有効期限、支払いステータスなどの独自の属性を持つサブスクリプションです.

ただし、リンクテーブルが単なるリンクテーブルである場合があると思います。カテゴリとの多対多の関係は、この良い例です。

したがって、この場合、別の 1 つのフィールドの主キーは必要ありません。自動割り当てキーを使用できますが、これは何も害を及ぼさず、特定のレコードの削除を容易にします。一般的な方法としては良いかもしれません。そのため、後でテーブルが独自の重要なデータ (サブスクリプションとして) を持つ重要なテーブルに発展した場合、自動割り当ての主キーが既に存在します。

重複を避けるために、2 つのフィールドに一意のインデックスを付けることができます。これにより、別の自動割り当てキーがある場合でも重複を防ぐことができます。両方のフィールドを主キーとして使用できます (これは一意のインデックスでもあります)。

したがって、1 つの考え方では、整数の自動割り当て主キーに固執し、複合主キーを避けることができます。これが唯一の方法ではありませんし、最善ではないかもしれませんが、本当に後悔するような問題に陥ることはありません。

しかし、あなたがしていることのようなものについては、おそらく 2 つのフィールドだけで問題ないでしょう。2 つのフィールドを複合主キーにするか、少なくとも 2 つのフィールドに一意のインデックスを設定することをお勧めします。

于 2013-02-03T19:58:43.940 に答える
4

2番目のジャンクションテーブルを使用します。ただし、これら 2 つのフィールドを主キーにします。これにより、重複エントリが制限されます。

于 2014-10-23T14:46:10.077 に答える