ショップのような構造のSQL Serverの価格フィールドに最適なタイプは何ですか?
この概要 を見ると、money、smallmoney、次にdecimal/numeric、最後にfloatおよびreal。
名前、メモリ/ディスク使用量、値の範囲:
これらのタイプで価格値を保存することは本当に賢明ですか?たとえば、 INT?
ショップがドルを使用しているとしましょう。彼らはセントを持っていますが、価格が49.2142342ドルではないので、セントを示す多くの小数を使用すると、SQL帯域幅の浪費のようです。第二に、ほとんどの店は200.000.000に近い価格を表示しません(誰かが私にパリの有名なタワーを売ろうとしない限り、少なくとも通常のウェブショップではそうではありません)。
では、なぜintに行きませんか?
Intは高速で、4バイトしかないため、ドルではなくセントで値を保存し、値を提示するときに除算することで、簡単に小数を作成できます。
もう1つの方法は、4バイトのsmallmoneyを使用することですが、これには計算を実行するためにCPUの計算部分が必要になります。ここで、Intは整数の累乗なので、マイナス面ではすべての結果を分割する必要があります。
Smallmoney/moneyフィールドを使用する場合、地域設定に「通貨」関連の問題はありますか?これらはC#/。NETでも何を転送しますか?
長所/短所はありますか?整数値かsmallmoneyか他の何かを求めますか?
あなたの経験は何を伝えていますか?
数値が常にsmallmoney
の範囲内に収まると確信している場合は、それを使用すると、数バイトを節約できます。それ以外の場合は、money
を使用します。しかし、最近のストレージは安価です。 1億レコードを超える追加の4バイトは、まだ半分GB未満です。ただし、@ marc_sが指摘するように、SQLサーバーのメモリフットプリントを削減できる場合は、smallmoney
を使用します。
簡単に言えば、smallmoney
でうまくいけるなら、そうしてください。 mightが上限を超えると思われる場合は、money
を使用してください。
しかし、notを使用すると、浮動小数点型が使用されます。そうしないと、丸めの問題が発生し、適切に処理しないと、ランダムなセントを失ったり獲得したりします。
int
の使用に反対する私の議論:int
を格納し、100(10000)で除算して値を取得し、値を格納するときに乗算することを忘れないようにして、ホイールを再発明する理由。私の理解では、お金のタイプはとにかく基礎となるストレージタイプとしてint
またはlong
を使用しています。
.NETの対応するデータ型に関しては、decimal
になります(これにより、C#コードの丸めの問題も回避されます)。
お金を保管している場合は Money データ型を使用します(国債のような莫大な金額をモデル化しない限り)-精度/丸めの問題を回避します。
NUMERIC/DECIMALを使用します。 MONEY/SMALLMONEYは避けてください。 これが理由の例です 。遅かれ早かれ、MONEY/SMALLMONEYタイプは、丸めエラーのためにダウンさせる可能性があります。通貨の種類は完全に冗長であり、有用なものは何もありません。通貨の金額は他の10進数と同じです。
最後に、MONEY/SMALLMONEYタイプはMicrosoft独自のものです。 NUMERIC/DECIMALは、SQL標準の一部です。それらはより多くの人々に使用、認識、理解され、ほとんどのDBMSやその他のソフトウェアでサポートされています。
個人的に、私は店の価格を保存するために小さなお金またはお金を使います。
Intを使用すると、他の場所で複雑さが増します。
また、韓国ウォンまたはインドネシアルピーでも2億ドルは完全に有効な価格です...
SQLデータ型money
およびsmallmoney
はどちらもc#decimal
タイプに解決されます。
http://msdn.Microsoft.com/en-us/library/system.data.sqltypes.sqlmoney(v = VS.71).aspx
だからあなたはdecimal
に行くのも良いだろうと思っています。個人的に私はdouble
を金融業界で働いているすべての人生で使用しており、パフォーマンスの問題などを経験していません。実際、特定の計算などで、より大きなデータ型を使用すると、精度を高めるため。
Moneyデータ型を使用します。個別にSmallmoneyの値を超えることはできませんが、複数のアイテムがそれを超えるのは簡単です。
私の質屋アプリでは、質屋のオペレーターが$ 5.00から$ 10,000.00を貸し出します。ローンの金額を計算するとき、セントとの取引を避けるために、金額を最も近いドルに丸めます(利息の支払いにも同じことが当てはまります)。ローンの金額が$ 50.00を超えると、ドルの請求額を最小限に抑えるために、最も近い$ 5.00(つまり、$ 50、$ 55、$ 60 ...)に丸められます。したがって、transaction.calculated_loan_amountにはDECIMAL(7,2)を使用し、transaction.loan_amountにはDECIMAL(5,0)を使用します。アプリはペニーへのローン金額を計算し、その金額をloan_amountに入れます。$ 50未満の場合は最も近いドルに、それより大きい場合は最も近い$ 5.00に丸められます。