web-dev-qa-db-ja.com

自己参照テーブル列を外部キーにする必要がありますか?

たとえば、カテゴリの階層を作成するには、同じテーブル内の別のカテゴリを指す列 'parent_id'を使用します。

これは外部キーである必要がありますか?短所/短所は何でしょうか?

30
meleyal

はい。孤立(親のないエントリ)がないことを確認し、使用法に応じて、カスケード削除を定義すると、親が削除されると、そのすべての子も削除されます。

不利な点は、他の外部キーと同じように、わずかなパフォーマンスの低下です。

31
Mikezx6r

はい、そうすべきです。データベースのリレーションに、同じデータベース内の別のリレーションの主キーとして機能する属性がある場合は、それをFKにする必要があります。

外部キーに関連する利点 をお楽しみいただけます:

  • 関係が適切に設計されていると仮定すると、外部キーの制約により、プログラマーがデータベースに不整合を導入することがより困難になります。
  • データベースサーバーによるこれらの制約のチェックを一元化すると、アプリケーション側でこれらのチェックを実行する必要がなくなります。これにより、異なるアプリケーションが同じ方法で制約をチェックしない可能性がなくなります。
  • カスケード更新と削除を使用すると、アプリケーションコードを簡素化できます。
  • 適切に設計された外部キールールは、テーブル間の関係を文書化するのに役立ちます。

短所:

  • 外部キーを定義する場合、一括操作の実行が難しい場合があります。
  • 多分それはより多くのディスク使用量とわずかなパフォーマンスの低下を意味します。
13
Guido

はい、そうすべきです。

利点(外部キーに関して):

  • Parent_idがテーブル内の実際の行を参照していることを確認します
  • 子を持つ親の誤った削除を防止するか、削除カスケードを使用して子も削除します
  • オプティマイザーが使用できる情報を提供します

本当のデメリットは考えられません。

6
Tony Andrews

はい、外部キーにする必要があります。

利点は、冗長性の少ない、より優れたデータモデルになります。

4
Galwegian