- PR -

1つの DataSet を3つのテーブルで使えますか

投稿者投稿内容
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-04-10 19:43
引用:

One.netさんの書き込み (2008-04-10 11:03) より:

(H16年の販売_16TableとH17年の販売_17Table及びH18年の販売_18Table)をメインメニュー等で
選択し、選択年度の販売管理で使用したい。




上記を前提として、よこけんさん、さかもとさんも書かれていると思いますが。。。

引用:

毎年のテーブル更新処理を次のようにします
1.「販売-2」テーブルは、データを破棄し、「販売-1」のデータを全てコピーします
2.「販売-1」テーブルは、データを破棄し、「販売-0」のデータを全てコピーします
3.「販売-0」テーブルは、データを破棄し、「販売」のデータを全てコピーします
ソフト開発は、アイデアや発想の競争みたいですね。おかげさまで以上のように考えましたが、
参考意見をお聞かせいただければ幸いです。



と言う事があれば。結果は違うと思います。

(私は)テーブルを一つにした方がよいと思います。
   (よこけんさん、すでに書いてましたね。。。。)
 
  (テーブルが動的となればシステム全体でパラメータが1つ
      増える事になり色々とやっかいな事が増えると思います)
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-04-10 20:00
引用:
One.netさんの書き込み (2008-04-10 17:52) より:
そこで、さかもとさん、よこけんさんのアイデアをいただきファイル名は次のように固定します。
「販売」・・・・システムのDataSetへBindingSourceでLoadされています
「販売-0」・・・本年分の保存Table
「販売-1」・・・前年分の保存Table
「販売-2」・・・前前年分の保存Table
年度の選択処理:洗濯した該当保存Tebleデータを「販売」Tableに全てコピーします


そうですね、テーブル名は固定がいいと思います。
ただ、選択した年度のデータを販売テーブルに全てコピーする処理が、パフォーマンスにどう影響してくるか不安ですね。(アプリケーションで選択年度を変更するたびにコピーを行うんですよね?)
あと、複数ユーザーが同一 DB にアクセスする場合は、これだと厳しいかもしれません。
代替案はあまり思いつかないのですが、例えばビュー (Access だとクエリーかな) を活用できませんか?
「販売」ビューで3つのテーブルのデータを一まとめにして、SELECT 文の条件式で年度を指定するという感じで。
やはり、変更コスト次第かもしれませんが。
それに、結局テーブルを一つにするのと同じことになるかな。。。それだったらテーブル一つでやった方がいいってことになりますね、うーん (-_-

引用:
One.netさんの書き込み (2008-04-10 17:52) より:
毎年のテーブル更新処理を次のようにします
1.「販売-2」テーブルは、データを破棄し、「販売-1」のデータを全てコピーします
2.「販売-1」テーブルは、データを破棄し、「販売-0」のデータを全てコピーします
3.「販売-0」テーブルは、データを破棄し、「販売」のデータを全てコピーします


ん?3はいらないのでは?
# 僕が根本的に勘違いしてるのかな・・・
_________________
C#と諸々
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-04-10 23:11
坂本さん、ご意見ありがとうございます。
「前々年」以上前のデータも破棄するのでわなく、フルバックアップで取って置くとの事
参考にします。ただ更新処理が複雑になりますね。

indigo-xさん、ご意見ありがとうございます。
投稿日時: 2008-04-10 17:52の投稿内容を修正し、接続するテーブルは「販売」テーブル1つに
訂正し、年度切替用のバックアップデータを3年分保存しておくテーブルを準備して置くように
しました。
しかし年度切替都度、該当年度バックアップテーブルから「販売」テーブルに全レコードを
コピーする必要がありパフォーマンスに問題があるかもしれません。

よこけんさん、ご意見ありがとうございます。
「販売-0」テーブルは、データを破棄し、「販売」のデータを全てコピーは不用かもしれません。
しかし、少々面倒な更新処理になってしまいそうですね。またindigo-xさんにも申し上げましたが
年度切替都度、該当年度の全レコードを「販売」テーブルにコピーする必要があり、よこけんさんの
いわれるとおりパフォーマンスも心配ですが、なんとなく複雑な処理をしているようで
もっとスマートな方法はないものかと思案しています。
何かいいアイデアが思いつかれれば教えてください。

前を全に修正
扶養を不用に修正

[ メッセージ編集済み 編集者: One.net 編集日時 2008-04-10 23:13 ]

[ メッセージ編集済み 編集者: One.net 編集日時 2008-04-10 23:16 ]
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2008-04-10 23:38
さかもとです。

>>もっとスマートな方法はないものかと思案しています。

そこで、最初に戻ります。
やはり、よこけん様おっしゃるようにテーブルレイアウトの見直しを行った方が今後の保守容易性を含めベストかと思います。

どのような環境かは存じ上げませんが、One.netさんのおっしゃる仕様はもちろん「間違いではない」と思います。ただ、なんというか昔の汎用機での処理(COBOL)をちょっと思い出しました。AccessなのかOracleなのかSQLServerなのか分かりませんが、せっかくRDBを使うのであればそれらしい使い方があるんじゃないかなーと。(リプレイス案件?)

重ねて申し上げますが、One.netさんの方法が間違っているわけではありませんし、仕様上そうせざるを得ないのかもしれません(容量、速度など)また、テーブルのレイアウト変更が結果として「最悪だったー」になるかもしれません。

ただ、当初の質問内容の文面からのみ想像すると上記のような感想を持ちました。


_________________
------------------------------------------
拝啓、さかもとと申します♪
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-04-11 08:34
さかもとさん、indigo-xさん、よこけんさん、いろいろご意見ありがとうございました。
皆様の言われることを総称しますと「3年分のデータを1つのテーブルで管理しフォームのロード時にFill で
クエリーを掛けたほうが今後の保守容易性や年度切替のパフォーマンスを考えれたほうがよい」と言われて
いる様で、再度システムを検証し、「3年分のデータを1つのテーブル」で管理する方法を検討いたしました。

この場合のシステムについて以下の疑問点についてご指導下さい。
1.販売テーブルに年度選択用列(フィールド)を追加するのではなく販売テーブルの発行年月日の範囲指定
で選択するのはパフォーマンス的に問題でしょうか
※実際にテストしてみますが今手元に1年分のデータがありません。
※3年分を2年分データとし、範囲ではなく大小比較にすればパフォーマンスはよくなりますか。

2.たまたまこのシステムはシステム立ち上げてから終了させるまでメインメニューが開いたままになっています。
よってメインメニューを開くときに販売テーブルをFillし、システム終了まで販売DataSetを閉じないように
する事は可能(非常識)でしょうか。そして年度切替時にのみ該当年度のFillで販売DataSetを変更すれば
パフォーマンスもそれほど問題にする必要がなくなると思います。
※もともと年度切替の頻度は年間に10〜20回程度です。
※販売レコードの追加や編集時にはアップデートしておきます。
※このシステムのDBは1人使用です。
★追加★:上記2のテストしてみたところ、別のフォームRoad時にFillして作成した
販売DataSetを使おうとしましたが使えません。2の方法は不可能ですか?

以上、再度ご意見いただければ助かります。よろしくお願いいたします。



「このシステムのDBは1人使用です。」を追加修正
★追加★:の分を追加
[ メッセージ編集済み 編集者: One.net 編集日時 2008-04-11 08:40 ]

[ メッセージ編集済み 編集者: One.net 編集日時 2008-04-11 09:03 ]
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-04-11 09:56
随分パフォーマンスを気にされているようですが、
データ量はいったいどれくらいあるのでしょう?

ちなみに Access にはファイルサイズの上限に 2GB という制限があります。
データ量が多いなら SQL Server にした方がいいような気もします。
無料の Express Edition でも、最大サイズは 4GB あります。

1.
Access のパフォーマンスについては詳しくないのですが、
年度列を追加するほうが高速なのは確かでしょう。
元々テーブルを分けようと考えていたくらいなのですから、
年度列を追加して、しっかりとデータを区切ったほうがよいと思います。
年度列を追加することに、何か不都合があるのでしょうか?

2.
不可能ではありませんが、あまり良い方法ではないと思います。
Fill して持っておくということは、それだけのメモリを消費し続けることにもなります。
データ量が多い場合、むしろこの方法の方が大変なことになります。
必要なときに、必要な分だけ Fill すればそれでよいと思います。
パフォーマンス的にも、インデックスを使用した検索で、
取得するデータ量がそんなに多くなければ、大した問題にならないはずです。


また、DataGridView は基本的に大量のデータをバインドすると遅いです。
仮想モードを使えば多少速くなるらしいですが。
基本的には大量のデータを一度にバインドするようなことはせず、
条件で絞り込ませるなどしてバインドした方がよいです。
(逆にあまりたくさん表示しても見られないでしょうし…)
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-04-11 10:39
投稿文が間違えましたので全文削除し、追加投稿します。

[ メッセージ編集済み 編集者: One.net 編集日時 2008-04-11 10:42 ]
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2008-04-11 10:42
さかもとです。

私も「1,2」共にテッテ様と同意見です。

テストデータは作ればいくらでも件数を増やすことができます。
実地的で完璧なテストデータを作ることはなかなか難しいですが、
パフォーマンスの測定、容量の確認くらいであればキーを変えて
どんどん追加したものでも十分な場合もあります。

是非、テストデータを作成し実際にいろいろなパターンで検証
してみてください。
_________________
------------------------------------------
拝啓、さかもとと申します♪

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