Ber*_*nDK 29 c# sql-server database-design query-optimization linq-to-sql
我想知道SQL Server中的价格字段对于类似商店的结构的最佳类型是什么?
看看这个概述,我们有数据类型称为money,smallmoney,然后我们有十进制/数字,最后浮动和真实.
名称,内存/磁盘使用情况和值范围:
将价格值存储在这些类型中真的很明智吗?那怎么样.INT?
让我们说一家商店使用美元,他们有美分,但我认为价格不是49.2142342所以使用大量小数显示美分似乎浪费了SQL带宽.其次,大多数商店不会显示200.000.000附近的任何价格(至少在正常的网上商店,除非有人试图在巴黎卖给我一座着名的塔)
那么为什么不去找一个int?
一个int很快,它只有4个字节,你可以很容易地产生小数,通过以美分而不是美元保存值然后在你呈现值时除以.
另一种方法是使用4个字节的smallmoney,但这需要CPU的数学部分来进行计算,其中Int是整数幂......在缺点上你需要划分每个结果.
使用smallmoney/money字段时,区域设置是否存在"货币"相关问题?这些在C#/ .NET中也会转移什么?
任何利弊?去整数价格或小钱币或其他?
你的经验告诉我什么?
lc.*_*lc. 22
如果您完全确定您的数字将始终保持在范围内smallmoney,请使用它,您可以节省几个字节.否则,我会用money.但请记住,这些天存储很便宜.超过1亿条记录的额外4个字节仍然不到半个GB.正如@marc_s指出的那样,使用smallmoneyif if可以减少SQL Server的内存占用量.
长话短说,如果你可以逃脱smallmoney,做.如果您认为自己可能超过最大值,请使用money.
但是,千万不能使用浮动小数点型或者你会得到四舍五入的问题,并会开始失去或获得随机美分,除非你正确地对付他们.
我反对使用的论点int:为什么通过存储一个int然后必须记住除以100(10000)来重新发明轮子来检索值并在你去存储值时再乘以.我的理解是货币类型无论如何都使用int或long作为底层存储类型.
至于.NET中相应的数据类型,它将是decimal(这也将避免C#代码中的舍入问题).
如果您要存钱,请使用Money数据类型(除非像国债一样建模大量资金) - 它避免了精确/舍入问题.