あるプロジェクトで
OracleにアクセスするJavaのプログラムを書いています。
使用しているテーブル定義は、
主キーでも何でもない項目ほぼ全てにNotNull制約が付いています。
別にNotNull制約を除けば主キー以外の制約は何もありません。
これからつく予定もありません。
そこでふと、
各項目の入力値は全てプログラム側でチェックしていますので
プライマリキーや共通のフッタ部分(登録日、登録ProgramIDなど)を除けば
Not Null制約は全くいらないんじゃないかと思いました。
このような場合、NotNull制約は何の為についているんでしょうか?
No.5ベストアンサー
- 回答日時:
> もうちょっと正規化して、別テーブルにしてもらえませんか?とお願いもしましたが、
> もう決まっているから駄目と言われました。
> それで一体どうすればいいのかわからなくなって、
> 全項目NotNullを外せばいいんじゃないか?と思って質問してしまいました。
>
> こういう場合、どういう対処が望ましいのでしょうか?
正規化できるのであれば正規化するに越したことはないですが、できないのであれば仕方がないでしょう。
NOT NULL 制約の有無はソート列として指定された列以外ではあまり影響を与えることはありません。ましてや、WHERE 句の条件にもならないような列ではなおさらのことです。
ただ、NOT NULL 制約を好き勝手に外す権利があるのであれば、好き勝手に正規化する権利が jack_s さんにあるような気がしなくもないですが・・・。
DB管理者にDB変更依頼を提出し、
無事NotNull制約を外す事ができました。
正規化してくれないのは
汎用機出身の方だからでしょうか?
でも無事解決できてなによりです。
みなさまのアドバイスのおかげで助かりました。
ありがとうございました。
No.4
- 回答日時:
たとえばVB6.0やAccessのVBAのように、
NULLがあるといちいちIsNull関数を使用して処理分岐を行う必要がある
プログラミング言語を使用する可能性があれば、そういう設計にする
のもアリだと思います。
今はもう少数派かもしれませんが、
NULLという概念が薄かった汎用機のネットワーク型DBの名残で、
そういう設計をされる方も以前は多かったか。
#要するに設計がRDBでないという:-)
No.3
- 回答日時:
自分側で初期値も入れられない、さらに正規化も不可ということでしたら、
選択としては、
・NOT NULL制約をはずす
・自分の処理の部分を行わせる前に、サブシステム側でレコードが初期化されていることを保証してもらう
このくらいじゃないでしょうか。
ダメというなら解決策を説得するしかないでしょうね。
No.2
- 回答日時:
プログラムのバグ等により、データに間違って NULL が入ってしまわないようにするためです。
そして、最大の目的はデータとプログラムを切り離すためです。(DOA の概念。データベース内のデータは単独で意味を持つ。そもそも、データベースとは単にデータを入れる箱ではない)
一意制約やチェック制約、参照制約についても同様です。
特に、Oracle の場合は制約の有無によって実行計画が変わる場合があるので、そういう意味でも意味があると思います。例えば、ORDER BY 句で指定された列に索引が張られている場合、NOT NULL 制約がなければソート処理が行われますが、NOT NULL 制約があれば索引が使用できるためソート処理は発生しない可能性があります。(NULL のデータが索引にはないため。NOT NULL 制約がないと Oracle は ORDER BY でのソートに索引が使えることを理解できない)
この回答への補足
回答ありがとうございます。
データとプログラムを切り離すという
概念はわかりました。
今回なぜこういう質問をしてしまったかと言いますと、
ユーザからいただいたテーブルファイル定義では、
関連がないだろう?という項目が色々1つのテーブルに定義されていて、
その項目ほぼ全てにNotNull設定されていたからです。
そのテーブルに対するレコードは、私が作成する画面で登録します。
ウィザード形式のような画面でしたら
セッション上に蓄積したデータを最後に一気に書き込むという事ができます。
ですが今回のケースではこちらの作業範囲ではない
別のサブシステムから更新される項目で、
私が作成する画面では初期値を設定できないのです。
仮にフラグ類や金額だけでしたら
『0』を初期値とさせてもらうことで対応できるかとも思ったのですが、
それ以外の各種コード類にまでNotNull制約が張られている始末です。
もうちょっと正規化して、別テーブルにしてもらえませんか?とお願いもしましたが、
もう決まっているから駄目と言われました。
それで一体どうすればいいのかわからなくなって、
全項目NotNullを外せばいいんじゃないか?と思って質問してしまいました。
こういう場合、どういう対処が望ましいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Viewにインデックスは張れ...
-
SQL*Loaderで、データを加工し...
-
統計情報について
-
INDEXの無効化
-
可変個数のデータはどう納める?
-
Oracle Databaseのインデックス...
-
データを削除しても表領域の使...
-
oracleのimpdpでORA-39166
-
datapumpの実行方法について
-
ORA-00959: 表領域'****'は...
-
postgreSQLのint型は桁数指定が...
-
DELETE文でFROM句を省略した場合
-
Access レコードを追加できませ...
-
検索結果の列数を動的に変更したい
-
object browser で処理を中断す...
-
Oracle上のテーブルからCREATE ...
-
db2にて数値を3桁文字にて出力...
-
Oracle10gで他のスキマーのテー...
-
テーブルからのselectにおいて...
-
GROUP BY で列名は指定できない...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Viewにインデックスは張れ...
-
INDEXの無効化
-
SQL*Loaderで、データを加工し...
-
アナライズとインデックス作成...
-
可変個数のデータはどう納める?
-
SQL*LoaderとInsertの違いについて
-
主キー以外の項目にNotNull制約...
-
【ANALYZE】 テーブル・インデ...
-
テスト環境と本番環境で、DBか...
-
統計情報について
-
索引の再構築をすべき?
-
文字列中のスペースを排除する...
-
ユニークインデックスについて
-
長年放置しているOracleを…なん...
-
IN 句ではインデックスが使用さ...
-
インデックス作成後アナライズ...
-
Wordで複数の索引を作りたい
-
OracleTextの索引再構築について
-
oracle10g統計情報取得の確認方法
-
データ表示順序
おすすめ情報