0

みなさん、良い一日を、

データベースに保存されているデータの計算方法について、いくつか質問があります。同様に、私はテーブルを持っています:

|   ID    | Item name | quantity of items | item price | date |

たとえば、10000件のレコードを保存しました。

最初に行う必要があるのは、日付間隔からアイテムを取得することです。そのため、計算にデータベース全体は必要ありません。そして、その日付間隔からアイテムを取得します。たとえば、計算するために、いくつかのテーブルを追加する必要があります。

full price = quantity of items *  item price

アイテムごとに新しいテーブルに保存します。したがって、日付間隔から選択されたアイテムのデータベースは次のようになります。

|   ID    | Item name | quantity of items | item price | date |  full price |

ポイントは、日付間隔で選んだアイテムを保存する方法がわからないことです。同様に、一時テーブルなどを作成する必要がありますか? これは ASP.NET Web アプリケーションを使用し、データベースでの計算には SQL クエリを使用すると思います。多分それを行う簡単な方法はありますか?私を助けてくれてありがとう。

4

5 に答える 5

0

アプリケーションで関心の分離を行う必要があります。

  • プレゼンテーション用のaspxページ
  • データの永続性のためのSQLサーバー
  • fullprice = p*qのような追加ロジックのためのある種の中間「ビジネス」レイヤー

たとえば、データ取得にLinq-2-sqlを使用している場合、エンティティに全額を追加するのは非常に簡単です。エンティティフレームワークについても同じです。また、必要に応じて、SQLselectでp*qの計算をすでに実行できます。パフォーマンスが本当に問題になる場合にのみ、一時テーブル、クラスター化インデックスを使用したビューなどについて考え始めることができます。

于 2012-10-26T19:53:13.677 に答える
0

いくつかのアプローチがあります:

  • SQLクエリを使用してその場で計算します-この方法では、データベースには何も保存されません
  • 同じまたは別のテーブルを使用して計算を実行する
  • 計算フィールドを使用する

データベースの負荷が低い場合(1分あたりのクエリ数が少なく、フェッチあたり数千行)、最初のアプローチを使用します。オンザフライでの計算のパフォーマンスが低い場合(数百万のレコード、1秒あたりxフェッチ...)、2番目または3番目のアプローチを試してください。3つ目は、データベースが計算フィールドと永続フィールドをサポートしている場合、たとえばMSSQLServerであれば問題ありません。

編集:

通常、他の人が言ったように、クエリで計算を実行します。つまり、プロジェクトが十分に単純である限りです。

まず、すべてのアイテムとその価格を格納するテーブルが複数のクライアントからの挿入/更新/削除で攻撃された場合、他のクライアントによってブロックされたりブロックされたりすることは望ましくありません。たとえば、テーブルXの更新により、テーブルXからの選択が完了するまでブロックされる可能性があることを理解する必要があります(ページ/行のロックを検索します)。これは、並列の非正規化構造(製品とそれに伴う計算されたものを含むテーブル)を気に入るはずであることを意味します。ここで、たとえばレポートが役立ちます。

第二に、計算が十分に単純で(a * b)、それほど多くないレコードに対して実行される場合、それは問題ありません。たとえば、1,000万件のレコードがあり、各行を他のいくつかの行と相関させ、一部のグループで集計を行う必要がある場合、計算/永続化フィールドによって時間を節約できる可能性があります。結果は最大10〜100倍速くなります。このアプローチを使用します。

于 2012-10-26T14:56:06.363 に答える
0

他の人が言ったように、これらのクエリを保存するのではなく、その場で実行できます。

ただし、質問に答えるには、このようなクエリでうまくいくはずです..

私はこれをテストしていないので、正しい軌道に乗せることはできますが、構文が少しずれている可能性があります。

最終的には、選択で挿入を行う必要があります

insert into itemFullPrice
select id, itemname, itemqty, itemprice, [date], itemqty*itemprice as fullprice from items where [date] between '2012/10/01' AND '2012/11/01'

繰り返しますが..構文が少しずれていても撃たないでください..今日は忙しい一日です:D

于 2012-10-26T15:08:12.227 に答える
0

10000 件のレコードがあるため、一時テーブルを使用するのは得策ではありません。

ProductsPriceHistory という名前の別のテーブルを用意した方がよいでしょう。このテーブルでは、毎月のレポートなどを定期的に計算して保存します。

これにより、レポートが高速になり、レポートを取得するたびに計算を行う必要がなくなります。

日付間隔が固定されている場合、つまり毎月、四半期ごと、毎年など、このアプローチは問題ないことに注意してください。2011 年 10 月 20 日から 2011 年 10 月 25 日、2011 年 5 月 20 日から 2011 年 8 月 13 日など、このアプローチは機能しません。

もう 1 つの方法は、ASP.Net で計算を行うことです。

于 2012-10-26T15:08:56.730 に答える
0

10000 件のレコードがあっても、このような計算をその場で行うのが最善の策です。これが、構造化データベースが行うように設計されたものです。

例えば:

SELECT [quantity of items] * [item price] AS [full price]
  , [MyTable].*
FROM [MyTable]

3 つ以上のテーブルと数千のレコードへの JOIN を含むより複雑な計算は、値の格納に役立つ場合があります。

于 2012-10-26T15:11:41.770 に答える