@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- @IT情報マネジメント 会議室 Indexリンク
- IT戦略
- 仕事の改善
- アーキテクチャ
- プロジェクト管理
- ITインフラ
- Webマーケティング
- BPMプロフェッショナル
- 業務アプリ
- - PR -
設計:RDBのテーブル設計で金額/数量にNull可
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-03-11 14:57
はにまるです。
私は業務アプリ設計者ですが、 他人の設計で、理解出来ない部分があります。 RDBテーブルの項目が金額や数量の時でも Null可としている設計を見かけます。 Oracleしか知りませんが、 四則演算の要素にNullが入ると結果はNullになります。 それを解決する為に、全数値項目で nvl(項目,0) を 記述しているのですが、私には理解出来ません。 設計者が近くにいる場合は伺っていますが、 2人とも「サンプルがそうだったから」という返答でした。 単なる、設計者の怠慢の結果だけなのでしょうか? 別DBではNullの扱いは異なるのでしょうか? 結構、見かけるので投稿して見ました。 # 技術的にはDBの話ですが、 # 「品質」(不要な障害削減対策)の扱いとしてITアーキテクチャに投稿。 | ||||||||
|
投稿日時: 2004-03-11 15:08
考え方 および方針にもよりますが、
>RDBテーブルの項目が金額や数量の時でも >Null可としている設計を見かけます。 別に変だとは思いませんが、処理されないケースとしてNULL 結果あるいは値としての0を分けているただそれだけのことでは | ||||||||
|
投稿日時: 2004-03-11 15:10
NAL-6295です。
常に必要な項目ならNull不可にするし そうでなければ、数量、金額だろうがNull許可にするのが妥当だと考えます。 だから、数量、金額にNull許可したという事が問題なのではなく、 どうしてNull許可にしたのか。 が問題かと思います。 その設計に必然性はあるのか。といった所です。 そういう意味では、はにまるさんの言われている事例は問題アリでしょうね。 その設計に必然性が感じられないので。 | ||||||||
|
投稿日時: 2004-03-11 15:21
unibon です。こんにちわ。
このような演算時の NULL の取り扱いは、3値論理として SQL の決まりごとなので Oracle に限ったものではありません。 #「決まりごと」と書いたものの誰が決めた? ANSI?
テーブルの列定義が NULL 可で、かつ、アクセスするときに常に nvl(項目,0) のようなことをするのは冗長なので、好ましくないです。常に nvl(項目,0) して良い状況ならば、おっしゃるように列定義は NULL 可にすべきではないでしょう。 なお、SQL において、列に NULL を入れることと、なんらかの演算で結果が NULL になることとは、本質的には異なると私は思います。列に NULL を入れることは、いわゆる N/A を入れることであり、とくに疑問には感じません。 一方、演算結果が NULL になるのは、異常値を示すのに NULL ひとつしかない、ということから来ているように思いますので、列が NULL 可・不可ということとは、話が違ってくるのでは、と考えます。NULL を入力とした演算の結果が NULL になったり、あと、外部結合の結果が NULL になったりするのも演算の一種だと思いますが、これを列定義の NULL 可とは違う概念なのに、たまたま NULL という同じものを使っているだけのように感じます。 | ||||||||
|
投稿日時: 2004-03-11 15:24
真っ先に思い浮かぶのは、「値が入っていない」というデータを表現する場合にNULL可、ですね。
ところで、はにまるさんはこの話を >金額/数量に と数値列に限定されてますが、文字列の時は同じ疑問を感じないんですか? 0とNULLが違うのと同様、長さ0の文字列とNULLも扱いが違うケースは有るはずですが。 | ||||||||
|
投稿日時: 2004-03-11 15:50
るぱんです。
いつもながら個人的な意見、及び雑感です。 僕は金額と数量をNULL可にする事は違和感感じました。 しかし、御祝儀の入金状況だけを表すテーブルという限定条件なら 「誰がお金をくれたか」が最優先事項となり、NULLを許可するだろうな・・・と 考え直しました。 まぁ、その前にテーブル分けることを考えますけどね。 (その心は、ビューから逆算してテーブルを作りたいから。) テーブルの使い勝手(データのテーブル格納後プロセスの使用方法)を考えて決めるかな? ※逆に意図的にNULL可にする状況の想定を聞いていった方が良いのかな?って感じました。 | ||||||||
|
投稿日時: 2004-03-11 15:52
余談ながら、Oracleでは長さ0の文字列とnullを区別してくれません。 # こいつはさすがにANSIの仕様ではなく、Oracleの実装の問題でしょうが。 正直、このOracleの仕様は何とかして欲しいところです。 | ||||||||
|
投稿日時: 2004-03-11 19:16
はにまるです、
短時間で一気に返答があったようですね。 嬉しい限りです。 >七味唐辛子さんへ 確かに、省略(無効)と0を別ける必要性があるのなら 理解出来るですが、分別する必要性が無い所なのです。 どちらでも良い状態であれば、「障害の起き難く」「コーディングが楽になる」設計を 選択した方が良いのでは?と思う所です。 >NAL-6295さんへ 数量、金額はお客様の認識上、必須では無い項目が多いのですが、 暗黙的に、省略=0を示す事が多い(空白だ!と仰るお客様はいませんでした。)です。 数値計算で空白の概念が無い為と思われます。 設計の必然性... 確かにその様に捉え話合った方が、理解し合えますね。 意識の無い設計者との話合いでは、骨が折れるかもしれませんが... ^^; >unibonさんへ NULLの扱いに関する他DBの情報ありがとうござます。 技術習得ツールの差では無かったのですね。 NULL許可になっている項目があるとNullが入る条件を知りたくて 何時も聞くのですが、 はにまる:「この項目にNullが入る事ってあるんですか?」 別のSE:「ああ、基本的に無いよ」(←基本的が味噌です!) はにまる:「じゃー nvl関数必要無いですよね?」 別のSE:「一応、手動でデータ作った事を考えてやっといて」 (Null不可で楽しましょよーーー。) 演算結果でNullを求める事は、記憶では無いです。 外部結合結果でNullはデータ無しの判断で良く利用しています。 >sauceさんへ 文字列のNullは、0バイト文字列と同じ考えでほぼ処理出来るので 問題視はしていません。 「文字列 & Null → Null」になるのなら一緒のレベルで問題視しますが... また、私が担当してい物件では、文字列が必須入力になる事は少ないです。 >るぱんさんへ 業務アプリ(特に機関系)では数値、金額が集計対象となる事が多いので 一般的に省略の意味でも0を設定するアプリケーションが多いのですが、 そのアプリとDB設計の思想が自分の中では矛盾しているのです。 確かに意図的にNULL可にする状況を聞きたいですね。 >Clusterさんへ え!0バイト文字列とNullを同一視するのはOracleだけなんですか... 勉強になりました。 |