- PR -

テーブルの設計について教えてください

1
投稿者投稿内容
Nature
会議室デビュー日: 2006/03/05
投稿数: 3
投稿日時: 2006-03-05 22:44
初めての書き込みです。
DBの設計の初心者です。
教えてください。

受注履歴テーブルを設計しようとしています。

単価と数量は列として用意すると思うのですが、
合計などの、計算して求められる数値は、
テーブルの列として含めるものなのでしょうか。
それとも、列としては用意せずに、
画面で表示する場合などに、計算した値を表示するものなのでしょうか。

一般的なことを知りたいのです。
ご教授お願いいたします。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-03-05 23:22
過去記事の、
件名:テーブル設計(集計値はテーブルに持たせるのが良い?)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=17907&forum=26
が近いと思います。

引用:

Natureさんの書き込み (2006-03-05 22:44) より:
単価と数量は列として用意すると思うのですが、
合計などの、計算して求められる数値は、
テーブルの列として含めるものなのでしょうか。


本当に「計算して求められる」のか、で決まるでしょう。すなわち、完全に従属する値かどうか、という決めの問題です。
当初は「計算して求められる」つもりだったけど、後でそうじゃなかった、ということも良くあります。
変更に強いのは、別に列を作っておくことでしょう。とはいえ、「変更に強い」というのはモノは言い様なだけで、要は正規化していないだけ、とも言えますが。
とにかく、迷うくらいなら、別に列を作っておくほうが良いでしょうね。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-03-05 23:24
導出できるデータは冗長化しない、が基本だと思いますが、
集計結果を先に計算しておくことでパフォーマンス向上を図る場合も多いです。

あとは、値引き等の関係で単価×数量=金額とならない場合もあるので、
その場合は単価×数量と意味の異なるデータになるので別個に持たせるでしょう。
よくあるパターンでは明細に値引き用のレコードを作ったりもしますけど。

ぶっちゃけ、どっちもあります。
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-03-06 08:10
原則は「計算で求めることができる値は列にもたない」のが基本です。

ただし、受注履歴のようなデータの場合は消費税率変更のようなことがあると
合計額の計算ルールが変わってしまうことも多いため、計算済みの合計額を
列値として保持するという手法もよく使われます。

本当は「そのときの単価」「そのときの数量」「そのときの消費税率」
「そのときの計算ルール」…etc.を保持しておくほうが便利ですが、
要素やルールが複雑で、すべて保持することがパフォーマンス上不利な
場合、あるいは要件としてそこまで厳密なものが要求されていない場合は
単純に計算済み合計値を持っておいてもよいでしょう。
Nature
会議室デビュー日: 2006/03/05
投稿数: 3
投稿日時: 2006-03-06 20:34
unibonさん、あしゅさん、vincentさん

教えていただいてありがとうございます。
参考になりました。
1

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