あるプロジェクトで
OracleにアクセスするJavaのプログラムを書いています。
使用しているテーブル定義は、
主キーでも何でもない項目ほぼ全てにNotNull制約が付いています。
別にNotNull制約を除けば主キー以外の制約は何もありません。
これからつく予定もありません。
そこでふと、
各項目の入力値は全てプログラム側でチェックしていますので
プライマリキーや共通のフッタ部分(登録日、登録ProgramIDなど)を除けば
Not Null制約は全くいらないんじゃないかと思いました。
このような場合、NotNull制約は何の為についているんでしょうか?
No.2
- 回答日時:
プログラムのバグ等により、データに間違って NULL が入ってしまわないようにするためです。
そして、最大の目的はデータとプログラムを切り離すためです。(DOA の概念。データベース内のデータは単独で意味を持つ。そもそも、データベースとは単にデータを入れる箱ではない)
一意制約やチェック制約、参照制約についても同様です。
特に、Oracle の場合は制約の有無によって実行計画が変わる場合があるので、そういう意味でも意味があると思います。例えば、ORDER BY 句で指定された列に索引が張られている場合、NOT NULL 制約がなければソート処理が行われますが、NOT NULL 制約があれば索引が使用できるためソート処理は発生しない可能性があります。(NULL のデータが索引にはないため。NOT NULL 制約がないと Oracle は ORDER BY でのソートに索引が使えることを理解できない)
この回答への補足
回答ありがとうございます。
データとプログラムを切り離すという
概念はわかりました。
今回なぜこういう質問をしてしまったかと言いますと、
ユーザからいただいたテーブルファイル定義では、
関連がないだろう?という項目が色々1つのテーブルに定義されていて、
その項目ほぼ全てにNotNull設定されていたからです。
そのテーブルに対するレコードは、私が作成する画面で登録します。
ウィザード形式のような画面でしたら
セッション上に蓄積したデータを最後に一気に書き込むという事ができます。
ですが今回のケースではこちらの作業範囲ではない
別のサブシステムから更新される項目で、
私が作成する画面では初期値を設定できないのです。
仮にフラグ類や金額だけでしたら
『0』を初期値とさせてもらうことで対応できるかとも思ったのですが、
それ以外の各種コード類にまでNotNull制約が張られている始末です。
もうちょっと正規化して、別テーブルにしてもらえませんか?とお願いもしましたが、
もう決まっているから駄目と言われました。
それで一体どうすればいいのかわからなくなって、
全項目NotNullを外せばいいんじゃないか?と思って質問してしまいました。
こういう場合、どういう対処が望ましいのでしょうか?
No.3
- 回答日時:
自分側で初期値も入れられない、さらに正規化も不可ということでしたら、
選択としては、
・NOT NULL制約をはずす
・自分の処理の部分を行わせる前に、サブシステム側でレコードが初期化されていることを保証してもらう
このくらいじゃないでしょうか。
ダメというなら解決策を説得するしかないでしょうね。
No.4
- 回答日時:
たとえばVB6.0やAccessのVBAのように、
NULLがあるといちいちIsNull関数を使用して処理分岐を行う必要がある
プログラミング言語を使用する可能性があれば、そういう設計にする
のもアリだと思います。
今はもう少数派かもしれませんが、
NULLという概念が薄かった汎用機のネットワーク型DBの名残で、
そういう設計をされる方も以前は多かったか。
#要するに設計がRDBでないという:-)
No.5ベストアンサー
- 回答日時:
> もうちょっと正規化して、別テーブルにしてもらえませんか?とお願いもしましたが、
> もう決まっているから駄目と言われました。
> それで一体どうすればいいのかわからなくなって、
> 全項目NotNullを外せばいいんじゃないか?と思って質問してしまいました。
>
> こういう場合、どういう対処が望ましいのでしょうか?
正規化できるのであれば正規化するに越したことはないですが、できないのであれば仕方がないでしょう。
NOT NULL 制約の有無はソート列として指定された列以外ではあまり影響を与えることはありません。ましてや、WHERE 句の条件にもならないような列ではなおさらのことです。
ただ、NOT NULL 制約を好き勝手に外す権利があるのであれば、好き勝手に正規化する権利が jack_s さんにあるような気がしなくもないですが・・・。
DB管理者にDB変更依頼を提出し、
無事NotNull制約を外す事ができました。
正規化してくれないのは
汎用機出身の方だからでしょうか?
でも無事解決できてなによりです。
みなさまのアドバイスのおかげで助かりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- 法学 次の職業の自由の制約に対する説明のうち、薬局距離制限に対する最高裁判所の判決に照らして、明らかに適当 1 2022/11/25 13:35
- 憲法・法令通則 次の職業の自由の制約に対する説明のうち、薬局距離制限に対する最高裁判所の判決に照らして、明らかに適当 1 2022/11/27 09:22
- 不動産業・賃貸業 賃貸契約契約の解除 1 2022/11/07 18:02
- 借地・借家 簡易裁判所の退去費用の裁判の答弁書について 1 2023/03/07 19:33
- 法学 会社法166条 但し書きについて 5 2022/12/10 07:01
- 政治 個人的に、憲法改正案を考えてみました。 意見を聞かせてください。 特に、9条(第2章 - 戦争の放棄 3 2023/02/22 22:08
- その他(保険) 火災保険は自分で保険会社を選べるのか?変えたらトラブルになるのか? 4 2023/02/01 16:08
- 弁護士・行政書士・司法書士・社会保険労務士 ★行政書士試験の民法についての質問になります。 代理での問題で分からない事があります。 問 建物を購 2 2023/05/18 22:06
- Access(アクセス) Accessで予定表を作成しようとしてます。 テーブル フィールド名 連番 オートナンバー型 年月日 2 2023/07/23 11:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INDEXの無効化
-
Viewにインデックスは張れ...
-
アナライズとインデックス作成...
-
SQL*Loaderで、データを加工し...
-
IN 句ではインデックスが使用さ...
-
文字列中のスペースを排除する...
-
主キー以外の項目にNotNull制約...
-
論理読み込みブロック数とは?
-
コストベース・オプティマイザ...
-
SQLの速度を調べるには…
-
SPLIT PARTITON後のインデックス
-
Oracle Databaseのインデックス...
-
SQLのIN句について
-
Access レコードを追加できませ...
-
データを削除しても表領域の使...
-
postgreSQLのint型は桁数指定が...
-
他の処理でselectさせないよう...
-
Data Pump で大量データインポ...
-
ORA-00959: 表領域'****'は...
-
カラムの存在チェック
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Viewにインデックスは張れ...
-
INDEXの無効化
-
SQL*Loaderで、データを加工し...
-
アナライズとインデックス作成...
-
可変個数のデータはどう納める?
-
SQL*LoaderとInsertの違いについて
-
インデックス作成後アナライズ...
-
主キー以外の項目にNotNull制約...
-
文字列中のスペースを排除する...
-
テスト環境と本番環境で、DBか...
-
OracleTextの索引再構築について
-
データ表示順序
-
統計情報について
-
SQLの処理速度改善にむけて
-
論理読み込みブロック数とは?
-
Wordで複数の索引を作りたい
-
索引の再構築をすべき?
-
IN 句ではインデックスが使用さ...
-
該当データが存在しないときに...
-
PervasiveSQL (Btrieve) で、デ...
おすすめ情報