Какой тип поля SQL Server лучше всего подходит для хранения значений цены?
Мне интересно, какой тип лучше всего подходит для поля цены в SQL Server для структуры, подобной магазину?
смотрим обзор у нас есть типы данных, которые называются деньги, smallmoney, то есть decimal / numeric и наконец float и реальные.
имя, память/диск-использование и диапазоны значений:
- деньги: 8 байт (значения: -922,337,203,685,477.От 5808 до +922,337,203,685,477.5807)
- Smallmoney: 4 байта (значения: -214,748.3648 до +214,748.3647)
- Decimal: 9 [по умолчанию, мин. 5] байт (значения: -10^38 +1 до 10^38 -1 )
- поплавок: 8 байт (значения: -1.79 E+308 до 1.79 E+308 )
- Real: 4 байта (значения: -3.40 E+38 до 3.40 E+38 )
действительно ли разумно хранить значения цен в тех типы? Как насчет eg. INT?
- Int: 4 байта (значения: от -2,147,483,648 до 2,147,483,647)
допустим, магазин использует доллары, у них есть центы, но я не вижу, чтобы цены были $49.2142342, поэтому использование множества десятичных знаков, показывающих центы, кажется пустой тратой полосы пропускания SQL. Во-вторых, большинство магазинов не показали бы цены около 200.000.000 (не в обычных интернет-магазинах, по крайней мере, если кто-то не пытается продать мне знаменитую башню в Париже)
Так почему бы не пойти на int?
int быстрый, его только 4 байта, и вы можете легко сделать десятичные дроби, сохраняя значения в центах вместо долларов, а затем разделить, когда вы представляете значения.
другим подходом было бы использовать smallmoney, который также составляет 4 байта, но для этого потребуется математическая часть процессора для выполнения calc, где As Int-целочисленная мощность... с другой стороны, вам нужно будет разделить каждый результат.
есть ли какая-либо" валюта", связанная проблемы с региональными настройками при использовании полей smallmoney / money? что они тоже будут передавать в C# / .NET ?
какие плюсы/минусы? Перейти на целочисленные цены или smallmoney или некоторые другие?
Что говорит ваш опыт?
7 ответов
если вы абсолютно уверены, что ваши номера всегда будут оставаться в диапазоне smallmoney
, используйте это, и вы можете сохранить несколько байтов. В противном случае я бы использовал money
. Но помните, в наши дни хранение дешево. Дополнительные 4 байта за 100 млн записей все еще меньше половины ГБ. Однако, как указывает @marc_s, используя smallmoney
Если вы можете, это уменьшит объем памяти SQL server.
короче говоря, если вы можете уйти с smallmoney
, do. Если вы думаете вы может перейти на МАКС, использовать money
.
но не используйте тип с плавающей запятой, или вы получите проблемы округления и начнете терять или получать случайные центы, если вы не справитесь с ними должным образом.
мой аргумент против использования int
: зачем изобретать колесо, сохраняя int
и потом, не забудьте разделить на 100 (10000), чтобы получить значение и умножить обратно, когда вы идете, чтобы сохранить значение. В моем понимании типы денег используют int
или long
как базовый тип хранения в любом случае.
что касается соответствующего типа данных в .NET, это будет decimal
(что также позволит избежать округления в коде C#).
использовать деньги тип данных, если вы храните деньги (если только моделирование огромных сумм денег, таких как государственный долг) - это позволяет избежать вопросов точности/округления.
ИСПОЛЬЗУЙТЕ ЧИСЛОВОЙ / ДЕСЯТИЧНЫЙ. Избегайте денег / SMALLMONEY. вот пример того, почему. Рано или поздно типы MONEY / SMALLMONEY, вероятно, подведут вас из-за ошибок округления. Типы денег полностью избыточны и не достигают ничего полезного - сумма валюты является просто еще одним десятичным числом, как и любое другое.
наконец, типы MONEY / SMALLMONEY являются собственностью Microsoft. Числовые / десятичные являются частью стандарта SQL. Они используются, признаются и поняты большим количеством людей и поддерживаются большинством DBMSs и другим программным обеспечением.
лично я бы использовал smallmoney или деньги для хранения магазинных цен.
использование int добавляет сложность в другом месте.
и 200 миллионов совершенно действительная цена в корейских вон или индонезийских рупиях тоже...
типы данных SQL money
и smallmoney
оба разрешают c# decimal
тип:
http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqlmoney(v=VS.71).aspx
поэтому я думаю, что вы могли бы также пойти на decimal
. Лично я использую double
всю свою жизнь работаю в финансовой отрасли и не испытывал проблем с производительностью и т. д. На самом деле, я нашел это для определенных расчетов и т. д., наличие большего типа данных позволяет более высокая степень точности.
Я бы пошел за типом данных Money. Invididually вы не можете превышать значение в Smallmoney, но было бы легко для нескольких элементов, чтобы превысить его.
в моем приложении ломбарда, операторы ломбарда кредитовать от $5.00 до $10,000.00 Когда они вычисляют сумму кредита, они округляют ее до ближайшего доллара, чтобы избегайте работы с центами (то же самое относится к процентным платежам). Когда сумма кредита превышает $50,00, они округляют ее до ближайших $5,00 (т. е. $50, $55, $60 ...), опять же, чтобы свести к минимуму исчерпание долларовых купюр. Поэтому я использую DECIMAL (7,2) для транзакции.calculated_loan_amount и DECIMAL (5,0) для торговая операция.сумма кредита. Приложение вычисляет сумму кредита до копейки и помещает эту сумму в loan_amount, где она округляется до ближайшего доллара, когда ниже $50 или до ближайшего $5.00, когда больше.