2017-12-06 2 views
0

私は、3つのテーブル= posts、categories、post_category(ピボットテーブル)を持つシンプルなデータベースを持っています。Pivotテーブルを使用するときに外来キーが本当に必要ですか?

  • 投稿 - ID |タイトル|ボディー| created_at/updated_at
  • カテゴリ - ID |名前| created_at/updated_at
  • post_category - post_id |主キーはIDですが、私は(記事中)キー外国を指定していない

をCATEGORY_ID。投稿テーブルの列として外部キー(category_id)を指定するか、既に2つのテーブル間の関係を指定したピボットテーブル(post_category)を使用することはできますか?

ありがとうございます!

+1

Plsは、質問に使用する前にタグの意味を確認します。 laravelだけがジャンクションテーブルをピボットテーブルとして参照します。 – Shadow

答えて

0

特に、クエリテーブルに関しては、外部キーを明示的に宣言する必要はありません。外部キーは、リレーショナル・インテグリティを強制します。つまり、互いに参照する必要がある表が実際に互いに参照することを保証します。つまり、MySQLは実際には外部キー宣言で何かを実行することによってほとんどのデータベースと異なります。MySQLはセカンダリインデックスを作成します。このインデックスは、パフォーマンスを向上させることでクエリに非常に便利です。

しかし、何もが必要です。外部キーの関係については、です。

+0

これは不完全です。ポストテーブルにカテゴリidを付けると、(fkが使用されているかどうかにかかわらず)1:nの関係を意味しますが、現在の構造はn:mの関係を意味します。 – Shadow

+1

@ Shadow列があると何も表示されません。 FKを宣言できれば、1:nの関係しかありません。列は1:nの関係なくそこに存在する可能性があります。それはすべて、表が何を意味しているか、すなわち状況に応じてどの行が入ってくるかによって異なります。照会の制約を知る必要はありません。彼らはテーブルの意味とどのような状況が発生する可能性があります。 – philipxy

+0

@philipxyは、テーブルの主キーを別のテーブルのフィールドとして持つことで、2つのテーブルが1:nの方法で関連していることを教えてくれます。さもなければ、他のテーブルのpkをフィールドとして持つのは無意味です。ゴードン氏が答えて指摘したように、FKの存在は関係の完全性を強制するだけです。 – Shadow

関連する問題