よろしくお願いします。
自分は、数年間開発経験のある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で質問しましょう!
似たような質問が見つかりました
- 数学 最大エントロピー原理をpythonで実装したい 2 2022/06/21 13:10
- その他(教育・科学・学問) 大学理系研究室における器材の貸し出しや取り決めについて 1 2022/12/01 22:04
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- 画像編集・動画編集・音楽編集 【急】【Zbrush】3DCG初心者です。ノートPCでのZbrush動作環境につきまして 1 2023/08/19 17:38
- 政治 自衛隊の対潜哨戒機P-1には、対空ミサイル防御システム「パルティア」を装備するべきですね? 6 2022/09/12 04:41
- 化学 水性ペンキで塗装する際の安全な頻度、ホルムアルデヒドについて。 2 2023/03/19 17:45
- その他(教育・科学・学問) 大学実験器材の貸し出しルール 1 2022/12/05 16:23
- IT・エンジニアリング SEとWebエンジニアの業務内容の違いについて 3 2023/06/22 23:23
- 出会い・合コン 自分は近日、街コンに参加しようと思うのですが、実際のところ男性は女性とどのくらいの確率で出会えるので 3 2022/10/13 12:22
- 政治 日本で訴訟件数が少ないのは、自民党とビッグモーターが詐欺組織だからですか? 2 2023/07/27 11:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Viewにインデックスは張れ...
-
SQL*Loaderで、データを加工し...
-
INDEXの無効化
-
論理読み込みブロック数とは?
-
SQL*LoaderとInsertの違いについて
-
オラクル クラサバ環境で動作...
-
【ANALYZE】 テーブル・インデ...
-
可変個数のデータはどう納める?
-
Oracle Databaseのインデックス...
-
Wordで複数の索引を作りたい
-
データを削除しても表領域の使...
-
CLOB型へのINSERT
-
異なるスキーマからデータを抽...
-
datapumpの実行方法について
-
ORA-00959: 表領域'****'は...
-
postgreSQLのint型は桁数指定が...
-
Access レコードを追加できませ...
-
count(1)とcount(*)の違い
-
エクセルからアクセスにインポ...
-
ACCESS 複数テーブル・複数フィ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Viewにインデックスは張れ...
-
INDEXの無効化
-
SQL*Loaderで、データを加工し...
-
アナライズとインデックス作成...
-
可変個数のデータはどう納める?
-
SQL*LoaderとInsertの違いについて
-
インデックス作成後アナライズ...
-
主キー以外の項目にNotNull制約...
-
文字列中のスペースを排除する...
-
テスト環境と本番環境で、DBか...
-
OracleTextの索引再構築について
-
データ表示順序
-
統計情報について
-
SQLの処理速度改善にむけて
-
論理読み込みブロック数とは?
-
Wordで複数の索引を作りたい
-
索引の再構築をすべき?
-
IN 句ではインデックスが使用さ...
-
該当データが存在しないときに...
-
PervasiveSQL (Btrieve) で、デ...
おすすめ情報