データベース

平成14年午後2問1について腑に落ちないことが。


> 設問2
商品の発注において、発注数量が最低数量を下回ってはならないという制約を、SQLによる整合性制約を用いて実装することにした。
次のSQL文中の□に入る適切な字句を答えよ。

CREATE ASSERTION 最低発注数量検査
CHECK( □ )


この問題で使う関係スキーマは以下の通り。
商品( 商品コード, 商品名, 最低発注数量, 生産工場コード, 以下略 )
発注( 発注番号, 生産年月, 発注年月日, 発注済フラグ )
発注明細( 発注番号, 商品コード, 発注枝番, 出荷予定年月日, 入庫予定年月日, 発注数量 )


仕様
・発注は、工場ごと、且つ生産年月ごとにまとめ、この単位で発注番号を付与する。
一回の発注数量は、商品ごとに定められた最低発注数量を下回ってはならない。
・工場の事情で出荷予定年月日までに発注数量全ての生産が間に合わない場合、発注数量の一部を先に出荷して、残りは翌月の出荷になることもある。
但し、生産が遅延した場合でも、発注時に指定した生産年月の仕入れ単価が適用される。
・このように、一つの発注に対する出荷が複数に分かれた場合、それぞれの出荷ごとの枝番(発注枝番)を付与して発注管理表に記録する。


でだ。
この問題の解答は
NOT EXISTS( SELECT * FROM 発注, 発注明細, 商品
WHERE 発注.発注番号 = 発注明細.発注番号
AND 発注明細.商品コード = 商品.商品コード
AND 発注.発注済フラグ = 'N'
AND 発注明細.発注数量 < 商品.最低発注数量 )


……これおかしくね?

発注した段階の発注数量が最低発注数量を下回っていないこと。
これは問題無いです。
ですが、1回の発注で出荷が複数になる場合を考えてみると発注数量がおかしいです。
その理由は、発注明細の管理単位が { 発注番号, 商品コード, 発注枝番 } だからです。
問題の説明では、発注した段階の管理単位は { 発注番号, 商品コード } です。
なのにいつの間にか枝番という属性が増えています。

枝番は一度に全てを出荷できない場合の措置のためにある属性です。
つまり、出荷予定年月日に出荷できる数量を示しているのであって、発注した数量そのものとは違います。


例えば、最低発注数量が10の商品があるとしましょう。
この商品を11個発注しました。
ところが工場の都合で最も早い出荷日では5つしか用意することができません。
残りの6個は暫くしてから出荷する事になります。
という条件を考えてみると発注明細に登録される発注数量は5個と6個です。
そうすると最低発注数量10を下回ることになります。
よって表明"最低発注数量検査"はエラーを返します。
発注は成立しても明細がエラーを引き起こす矛盾。


こうするのが良いんじゃないの?

商品( 商品コード, 商品名, 最低発注数量, 生産工場コード, 以下略 )
発注( 発注番号, 生産年月, 発注年月日, 発注済フラグ )
発注明細( 発注番号, 商品コード, 発注数量 )
出荷( 発注番号, 商品コード, 発注枝番, 出荷予定年月日, 入庫予定年月日, 出荷数量 )


例によってまたアフォみたいな勘違いをしているかもしれないので識者の見解を求む。