- PR -

データの持ち方につきまして

投稿者投稿内容
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-07-01 15:28
お世話になります。

初歩的な質問なのですが、テーブルのデータの持ち方についてご意見をいただけると幸いです。

【現状】
ネットショップでお客さんにポイントを発行します。
テーブル構造は下記の図のようになっています。

買ってくれたときには、注文明細テーブルのレコードに保存して、
顧客テーブルのポイントに加算します。
運用していく中で、顧客テーブルのポイントと注文テーブルと注文明細から
集計して求めたポイントの合計が違ってこないかちょっと不安です。
ポイントは注文時以外にも発行します。
顧客テーブルにポイントをもたず、現在のポイント数は集計で求めた方がよいでしょうか?
皆様のアドバイスをいただけますと幸いです

<顧客テーブル>
ポイント

<注文テーブル>
使用ポイント

<注文明細テーブル>
発行ポイント



さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2008-07-01 15:38
さかもとと申します。

>>運用していく中で、顧客テーブルのポイントと注文テーブルと注文明細から
集計して求めたポイントの合計が違ってこないかちょっと不安です。

運用によって変わってしまう可能性があるのであればどのように作り込んでも結果は同じです。

逆にどのような運用になっていてもポイントの整合性がとれなくなるような作り方はすべきではありません。

まずはどのようにレイアウトを組んでいくか?よりもどのような要件があるのか?を見定める方が良いと思います。


_________________
------------------------------------------
拝啓、さかもとと申します♪
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-07-01 16:02
引用:

骨骨★Rock!さんの書き込み (2008-07-01 15:28) より:
運用していく中で、顧客テーブルのポイントと注文テーブルと注文明細から
集計して求めたポイントの合計が違ってこないかちょっと不安です。
ポイントは注文時以外にも発行します。
顧客テーブルにポイントをもたず、現在のポイント数は集計で求めた方がよいでしょうか?


かぎりなく理想を言えば、顧客テーブルにポイントを持たず、集計で求めたほうが良いでしょう。
しかし、普通は顧客テーブルにポイントを持たせることがほとんどだろうと思います。

たとえば、財布の中の金額を求める際に、
・銀行のATMで引き出した明細
・お店で買い物したレシート
などを何十年も前からずっと持っていれば、財布の中にいくらあるかは財布の中を見なくても明細やレシートを集計すればわかります。しかし、これは現実的ではないと思います。
集計の対象が膨大になると、集計とは別の入れ物に記録しておかなくてはいけなくなるでしょう。こうする理由には、昔は集計の演算コストなどもあったのかもしれませんが、今はそういうコストはあまりかかりませんが、データーの整合性、などだけから見ても、分けておいたほうがなにかと便利だと思います。分けると冗長にはなりますが、分けないと、あとで、特別会計費みたいなものの扱いに困ってしまったりします。
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-07-01 16:09
引用:

逆にどのような運用になっていてもポイントの整合性がとれなくなるような作り方はすべきではありません。

まずはどのようにレイアウトを組んでいくか?よりもどのような要件があるのか?を見定める方が良いと思います。


さかもと様、

ご回答いただきましてありがとうございます。
おっしゃる通りで、胸が痛いです
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-07-01 16:15
引用:

かぎりなく理想を言えば、顧客テーブルにポイントを持たず、集計で求めたほうが良いでしょう。
しかし、普通は顧客テーブルにポイントを持たせることがほとんどだろうと思います。

たとえば、財布の中の金額を求める際に、
・銀行のATMで引き出した明細
・お店で買い物したレシート
などを何十年も前からずっと持っていれば、財布の中にいくらあるかは財布の中を見なくても明細やレシートを集計すればわかります。しかし、これは現実的ではないと思います。
集計の対象が膨大になると、集計とは別の入れ物に記録しておかなくてはいけなくなるでしょう。こうする理由には、昔は集計の演算コストなどもあったのかもしれませんが、今はそういうコストはあまりかかりませんが、データーの整合性、などだけから見ても、分けておいたほうがなにかと便利だと思います。分けると冗長にはなりますが、分けないと、あとで、特別会計費みたいなものの扱いに困ってしまったりします。



unibon様、

ご返信いただきましてありがとうございます。
参考になります。
やっぱり顧客テーブルにポイントを持たせた方が便利ですか。

ポイントの利用履歴を表示する画面を作成しているときに、
履歴は、注文テーブルや注文明細テーブルの情報ストアドで集計したものを
表示していて、ポイントの合計は顧客テーブルのポイントを表示していて、
ふと、本当にポイントの合計が合わなくなってしまう事がないか
不安に感じてきてしまいこちらの掲示板に投稿させて頂いた次第です。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2008-07-01 17:06
顧客テーブルに現在のポイント残高を持たせる点に、特に問題はないと思います。

不整合については、不整合が発生しないように作ればいい、ということになるのですが、そんなことができれば苦労はないわけで、不整合が起きた場合にどうしたら早期に発見できるか? という観点を追加してみるというのはどうでしょうか。

例えばポイントの増減については「ポイント履歴テーブル」で一元管理するとか、日次バッチで整合性チェックを行うとか。
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-07-01 17:34
引用:

例えばポイントの増減については「ポイント履歴テーブル」で一元管理するとか、日次バッチで整合性チェックを行うとか。



カーニー様、

ご返信いただきましてありがとうございます。
大変参考になります。整合性のチェックが重要なのですね。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-07-01 19:21
ポイント履歴テーブルにトリガーを仕組んで、
顧客テーブルのポイント残高を更新すると楽そうですね。

ECサイトなら残高の参照回数は多いでしょうけど、
残高の更新回数は少ないですしね。

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