[pgsql-jp: 30510] テーブルの構成について

js jsibasaki @ luftwaffe.zive.net
2003年 7月 18日 (金) 14:04:03 JST


こんにちわ。ちょっとPostgreSQLからそれる話なのですが。

例えば販売管理システムで売上伝票を発行する場合、通常この4,5つが大抵必要にな
ると思うのですが

・商品マスタ
・担当者マスタ
・得意先マスタ
・売上明細を格納するテーブル1(顧客と売上日など)
・売上明細を格納するテーブル2(伝票明細など)

よくACCESSの参考書などでは下記のようになっていますし、私も順当だと思っている
のですが

*商品マスタ
商品コード
商品名
原価
売価・・・

*担当者マスタ
担当者コード
担当者名・・・・

*得意先マスタ
得意先コード
得意先名
請求区分
消費税区分・・・

*売上明細1
伝票番号
日付
得意先コード・・・

*売上明細2
明細番号
行
伝票番号
商品コード
数量・・・

これらのテーブルを全て関連付けると下記のような売上明細のビューが作成できま
す。
|日付|得意先名|伝票番号|行|商品名|数量|単価|金額|担当者名|

しかし、これだと商品マスタから商品廃盤のため、商品情報が削除されたり、担当者
がリストラで辞めてしまっていなくなったとかいう事は日常よくあり、Left Joinな
どで関連付けしておいても
商品名や担当者名がNULLになるから、一年後とかに見たときに分からなくなってしま
うので
私は以前Oracleで過去の売上を検索するシステムを作った時、売上明細テーブルを一
つにして

*売上明細
日付
得意先コード
得意先名
担当者コード
担当者名
伝票番号
行
商品コード
商品名・・・

と、コードだけでなく文字の部分も伝票発行した際にINSERTするようにしました。
これだと、いちいちテーブルも結合しなくていいし、過去の情報を検索してもNULLが
なくて分かりやすいのです。検索速度もきちんと量ったわけではないけど、結合する
場合と変らないし。

しかし、参考書で推奨されている方法からしてみれば、良い方法ではないようです。
私は自社のシステムしか作った経験が無いので通常どういうやり方をされているのか
分かりません。

皆様はこのようなケースの場合どのようなテーブルを作ってらっしゃいますか?

長文になって申し訳ありません。












pgsql-jp メーリングリストの案内