@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- PR -

設計:RDBのテーブル設計で金額/数量にNull可

投稿者投稿内容
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-03-11 14:57
はにまるです。

 私は業務アプリ設計者ですが、
 他人の設計で、理解出来ない部分があります。

 RDBテーブルの項目が金額や数量の時でも
 Null可としている設計を見かけます。

 Oracleしか知りませんが、
 四則演算の要素にNullが入ると結果はNullになります。

 それを解決する為に、全数値項目で nvl(項目,0) を
 記述しているのですが、私には理解出来ません。

 設計者が近くにいる場合は伺っていますが、
 2人とも「サンプルがそうだったから」という返答でした。

単なる、設計者の怠慢の結果だけなのでしょうか?
別DBではNullの扱いは異なるのでしょうか?
結構、見かけるので投稿して見ました。

# 技術的にはDBの話ですが、
# 「品質」(不要な障害削減対策)の扱いとしてITアーキテクチャに投稿。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2004-03-11 15:08
考え方 および方針にもよりますが、

>RDBテーブルの項目が金額や数量の時でも
>Null可としている設計を見かけます。

別に変だとは思いませんが、処理されないケースとしてNULL
結果あるいは値としての0を分けているただそれだけのことでは

NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-03-11 15:10
NAL-6295です。

常に必要な項目ならNull不可にするし
そうでなければ、数量、金額だろうがNull許可にするのが妥当だと考えます。

だから、数量、金額にNull許可したという事が問題なのではなく、
どうしてNull許可にしたのか。
が問題かと思います。
その設計に必然性はあるのか。といった所です。

そういう意味では、はにまるさんの言われている事例は問題アリでしょうね。
その設計に必然性が感じられないので。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-03-11 15:21
unibon です。こんにちわ。

引用:

はにまるさんの書き込み (2004-03-11 14:57) より:
 Oracleしか知りませんが、
 四則演算の要素にNullが入ると結果はNullになります。


このような演算時の NULL の取り扱いは、3値論理として SQL の決まりごとなので Oracle に限ったものではありません。
#「決まりごと」と書いたものの誰が決めた? ANSI?

引用:

はにまるさんの書き込み (2004-03-11 14:57) より:
 それを解決する為に、全数値項目で nvl(項目,0) を
 記述しているのですが、私には理解出来ません。


テーブルの列定義が NULL 可で、かつ、アクセスするときに常に nvl(項目,0) のようなことをするのは冗長なので、好ましくないです。常に nvl(項目,0) して良い状況ならば、おっしゃるように列定義は NULL 可にすべきではないでしょう。
なお、SQL において、列に NULL を入れることと、なんらかの演算で結果が NULL になることとは、本質的には異なると私は思います。列に NULL を入れることは、いわゆる N/A を入れることであり、とくに疑問には感じません。
一方、演算結果が NULL になるのは、異常値を示すのに NULL ひとつしかない、ということから来ているように思いますので、列が NULL 可・不可ということとは、話が違ってくるのでは、と考えます。NULL を入力とした演算の結果が NULL になったり、あと、外部結合の結果が NULL になったりするのも演算の一種だと思いますが、これを列定義の NULL 可とは違う概念なのに、たまたま NULL という同じものを使っているだけのように感じます。
sauce
常連さん
会議室デビュー日: 2003/11/12
投稿数: 24
投稿日時: 2004-03-11 15:24
真っ先に思い浮かぶのは、「値が入っていない」というデータを表現する場合にNULL可、ですね。

ところで、はにまるさんはこの話を

>金額/数量に

と数値列に限定されてますが、文字列の時は同じ疑問を感じないんですか?
0とNULLが違うのと同様、長さ0の文字列とNULLも扱いが違うケースは有るはずですが。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-03-11 15:50
るぱんです。

いつもながら個人的な意見、及び雑感です。
僕は金額と数量をNULL可にする事は違和感感じました。

しかし、御祝儀の入金状況だけを表すテーブルという限定条件なら
「誰がお金をくれたか」が最優先事項となり、NULLを許可するだろうな・・・と
考え直しました。

まぁ、その前にテーブル分けることを考えますけどね。
(その心は、ビューから逆算してテーブルを作りたいから。)
テーブルの使い勝手(データのテーブル格納後プロセスの使用方法)を考えて決めるかな?

※逆に意図的にNULL可にする状況の想定を聞いていった方が良いのかな?って感じました。
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-03-11 15:52
引用:

sauceさんの書き込み (2004-03-11 15:24) より:

と数値列に限定されてますが、文字列の時は同じ疑問を感じないんですか?
0とNULLが違うのと同様、長さ0の文字列とNULLも扱いが違うケースは有るはずですが。



余談ながら、Oracleでは長さ0の文字列とnullを区別してくれません。

# こいつはさすがにANSIの仕様ではなく、Oracleの実装の問題でしょうが。

正直、このOracleの仕様は何とかして欲しいところです。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 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だけなんですか...
  勉強になりました。

スキルアップ/キャリアアップ(JOB@IT)