質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

2回答

910閲覧

DBの外部参照制約を設定しない場合のリスクについて

taksi15

総合スコア9

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/07/10 18:47

外部参照制約の有無について質問させてください

以下のテーブルで

deptuser
dept_iduser_id
-dept_id

親:dept、子:userの関係があるとき、
一般的にはuser.dept_idに外部参照制約を付けると思います。

例えばこのとき仕様や運用上の理由(userが先に登録されて、それに合わせてdeptを登録するパターンがある等)で
user.dept_idに外部参照制約を付けないというDB設計はしてよいのでしょうか。

また、親子関係のある場合に外部参照制約を付けないときの、リスク・デメリット等を教えて頂きたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

かつては外部参照を付けると遅くなるからと言うことで付けない(ロジックで整合性を担保する)ということもありましたが、付けておいた方が確実ですので、現在では付けるべきでしょう。

ただ外部参照は参照される側で参照される条件に沿ったインデックスを持っていないといけないといった制約があったりするので、それを満たせないなら作れないと言うことにはなります。

あと困るのは……

  • create table や drop table の際の順序が制限される(外部参照する側は外部参照されるテーブルより後に作成し、前に削除しないといけない)。まあ外部参照自体を外しておいてあとで設定すれば関係ありませんが
  • 同様に、データのバルクアウト・バルクインの際の順序も考慮する必要がある(これも、ツールの類いでは自動で一時外しなどをして処理されることがあります)

投稿2020/07/10 23:45

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taksi15

2020/07/11 08:05

付けるのが妥当ですよね。。 ご回答ありがとうございました
guest

0

ベストアンサー

外部参照制約は、値の整合性を保つという事が目的です。
オプションにもよりますが、基本的にはON UPDATE CACADE ON DELETE CACADEを設定すると思います。
参照元からレコードが削除されたら、参照先のレコードも削除されるというやつですね。

親が消えたらそれを参照している子も消えなくてはおかしいです。
それをDB側でやってもらうか、クライアント側でやるかという違いはありますが、
どう考えてもDB側でやったほうがミスがないです。

メリットは当然、整合性を保てる事です。
デメリットは、自分としては無いと考えています。
まずは基本的に設定するべきです。
逆に参照する必要があるものについて、参照制約をつけないと必ず整合性が取れないミスが生まれます。
通常において整合性取れなくていい場合ってなんなの?って感じです。

例外としては、ログをDBで保存したいケースです。
ユーザの行動履歴などをDBに保存するようなケースでは、
ユーザが退会したときに、ほんとにユーザのレコードを物理削除してしまうような運用の場合、
参照制約により関連レコードが消えてしまいます。
この場合は、ログテーブルに関しては参照制約を設定しないという事になりますが、
これはログであり、運用データではないので整合性が崩れていても問題がありません。
ログはあとで分析用に使ったりするもので、公開画面などに表示したりしないので
すでに存在しないレコードの情報があってもサービス側に影響はありません。

結論ですが、自分なら基本的に参照制約を設定しますが、
ケースバイケースの事があるため、
運用的に妥当であると判断したなら設定しなくても良いと考えます。

しかしながら繰り返しになりますけども、
あとで制約を外す事もできますし、まずは設定する。
開発中あるいは運用中に問題が起きたら外す。
というのが現実的と思います。
問題が起きた=運用上、参照制約を外す必要性が生まれたという事なので。

投稿2020/07/10 19:20

mingos

総合スコア4207

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/10 22:49

細かくて申し訳ない 「CASCADE」ですね。
taksi15

2020/07/11 08:07

経験上、外部参照を付けないことが無かったので、 個人的にもとりあえず付けた方が良いのではという気がしています,データの整合性は大事ですよね。 ログの件も参考になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問