今回はSQLServerのテーブル設計での失敗談をひとつ。
とあるシステム内で既存のシステムとほぼ似たような機能を作成することになり
テーブル構造もほぼ同じ作りにしたつもりでした。
テーブルはいわゆる伝票明細のようなもので、伝票番号、行番号がキーとなり
品番、細分、数量、金額などが入った構造です。
このとき品番、細分の重複は可で、未入力も可というルールになっています。
既存システムでは、この品番、細分はNot Nullかつ未入力時は空白で埋められていたのですが
あがってきたプログラムでは未入力時にはNullとなるようになっていました。
はい。私の設計漏れです。
しかしエントリがあがってきた段階では私もこのこと(元は空白で埋められていたこと)
に思いがいたらず、結合テスト以降の段階で別の集計プログラムでレスポンスに問題が
発生してしまいました。
この集計プログラムのために、品番、細分にはインデックスを張ったのですが、
Null値が入っているためにSQL文中にIsNull(品番,Space(9))などの記述が入っており
効果はありません。
このときにようやく元のシステムで空白で埋められていた意味を思い出し
Null制約をNot Nullに設定し、エントリも未入力時は空白で埋めるよう修正しました。
SQL文でも集計項目から関数をはずすことで劇的にレスポンスはアップしました。
今回のように、せっかく前のシステムで学んできたことを
次で台無しにしてしまうことの無いように、なぜそうなっているのか?ということを
ないがしろにしないようしましょう。