よろしくお願いします。
自分は、数年間開発経験のあるSEです。
Oracleの参照整合性制約は、実装するのが当たり前と思ってましたが、そうでもないのでしょうか?
というのは、情報処理の本などを見ると
「RDBMSは参照整合性制約の実装により、更新異状を排除することが重要な機能」
などと書いてあり、なるほど、そうかと思ったものでした。
もちろん、開発に携わったシステムでも実装されてました。ここまでは良かったのですが・・・
最近、関わっているシステムは、Oracleですが、参照整合性制約は実装されおらず、
全てアプリケーションがその辺を頑張ってます。
まあ、古いシステムなのでしょうがないかと思っていたのですが、今度のシステム更改(DB再設計含む)でも、
参照整合性制約は実装しない、というのです。
なんで実装しないのか、DB担当でないので分からないのですが、参照整合性制約を実装しないRDBなんて
クリープを入れないコーヒーのようなものではないかと、私は思うのです。
この感覚は、正しいのでしょうか?
専門家の方、経験豊富な方、ご意見お待ちしております。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
これには賛否両論があるので一概にどちらがよいとは言い切れません。
私はDBの物理設計コンサルタントとして客先でDBの物理設計を担当したことがありますが、その際には開発環境では参照制約を設定し、本番環境では競ってしないということに決まりました。制約を付けるということは、DML文が発生するたびに整合性のチェックされることになるので (Oracle にはチェックするタイミングを設定するオプションもあるが)、性能の劣化の原因にもなり得ます。
特に、参照制約の場合には他のテーブルにまで検索しに行く必要があるため、どうしても他の制約に比べてオーバーヘッドが大きくなってしまいがちです。
そのために付けないことも多いですが、だからといって、参照制約を設定できないようなDB設計をすることは望ましいとは言えません。
あと、既にお気づきのようですが、参照制約を設定したからといってアプリケーション側のハンドリングが不要になるわけでもありません。まさか、ユーザとのインターフェースに ORA-XXX と表示されるようなアプリケーション設計はされないでしょうから。
> 開発環境では参照制約を設定し、本番環境では競ってしな
なるほど!そういう方法もあるのですね。
> 参照制約を設定できないようなDB設計をすることは望ましいとは言えません。
ですよね!
つまり、設計上は(当然のことながら)参照整合性を保証するような設計(アプリも)を行い、
開発環境では念のため参照制約を実装しておいて、思わぬアプリのバグなどを見つけるのに役立てる、と。
本番では、性能を睨みつつ実装するかどうかを考えても良い訳ですね。
かなり、心のモヤモヤが晴れたようです。
ありがとうございます!
No.2
- 回答日時:
>専門家の方、経験豊富な方、ご意見お待ちしております。
これには該当しませんが...
私も参照整合性制約は実装するほうが望ましいと思います。ただし、画面などを使用したアプリの場合、違反レコードに対するエラーメッセージはOracleそのままよりユーザーに分かり易いメッセージにしたり、強制ロールバックよりエラーデータ保存処理するなど、適切なエラー処理は必要になってくると思います。となると、プロジェクトリーダーは「画面側で整合性チェックと等価の機能を実装しているから管理面、工数を考えてなくしちゃえ」と参照整合性制約を実装しないという考えの方もいらっしゃると思います。
回答ありがとうございます。
確かに制約をDBで実装していても、けっきょくアプリでハンドリングは必要ですよね。
だったら最初からDBでは制約しなくていいか、ということにもなるかもしれませんね。
No.1
- 回答日時:
僕はブラックが好きです(笑 というのはさておき)
確かにうまくはまれば便利なので、理想としてはそうしたいですが、
参照整合性制約って、問答無用/厳格に適用されてしまうので、
データメンテのときなどのイレギュラーな処理や仕様変更の際に妙に不便だったりすることがあります。
また、そういう制約が破綻するような仕様変更があったときに、
制約をはずして、自前のチェックロジックをあちこちに実装しないとならなくなるので、
だったら最初から自前でチェックしとけばって感覚でしょうか。
回答ありがとうございます。
> そういう制約が破綻するような仕様変更があったときに、
> 制約をはずして、自前のチェックロジックをあちこちに実装しないとならなくなる
なるほど、そういうことは考えてみませんでした。
いったん実装した制約を外すのはかなり怖いですね。
そこまで見越して、実装の有無を考えることもあり得る、ということですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Oracle インデックスについて
-
SQL文を教えてください
-
Viewにインデックスは張れ...
-
目的のインデックスが使用され...
-
Access レコードを追加できませ...
-
表領域の使用率がもうすぐ100%
-
dba_extentsの考え方について
-
Data Pump で大量データインポ...
-
ExcelをAccessにペーストエラー
-
アクセスマクロで、csv データ...
-
テーブル名を指定してCsv出力
-
CLOB型へのINSERT
-
SQLでスキーマ名(所有者名)の...
-
エクセル マクロ A列の <table>...
-
同じSELECT文同士でのデ...
-
select insert 句
-
DBリンク&シノニム経由インデ...
-
DELETE文でFROM句を省略した場合
-
3つのテーブルの処理について
-
ORA-00959: 表領域'****'は...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Viewにインデックスは張れ...
-
INDEXの無効化
-
SQL*Loaderで、データを加工し...
-
アナライズとインデックス作成...
-
可変個数のデータはどう納める?
-
インデックス作成後アナライズ...
-
SQL*LoaderとInsertの違いについて
-
SQLのIN句について
-
索引の再構築をすべき?
-
論理読み込みブロック数とは?
-
文字列中のスペースを排除する...
-
インデックスの作成
-
OracleTextの索引再構築について
-
【ANALYZE】 テーブル・インデ...
-
一括更新の際のロールバックセ...
-
統計情報について
-
SQLLOADERについて
-
オプティマイザはどちらのモー...
-
主キー以外の項目にNotNull制約...
-
テーブル設計時の注意点と理想...
おすすめ情報