Подтвердить что ты не робот

Какой тип поля SQL Server лучше всего подходит для хранения значений цен?

Мне интересно, какой лучший тип для поля цены в SQL Server для магазина-подобной структуры?

Рассматривая этот обзор, у нас есть типы данных, называемые деньгами, smallmoney, тогда у нас есть десятичная/числовая и, наконец, float и real.

Название, память/использование диска и диапазоны значений:

  • Деньги: 8 байт (значения: -922,337,203,685,477.5808 до +922,337,203,685,477.5807)
  • Smallmoney: 4 байта (значения: -214,748.3648 до +214,748.3647)
  • Десятичный: 9 [по умолчанию, мин. 5] байтов (значения: -10 ^ 38 +1 до 10 ^ 38 -1)
  • Float: 8 байт (значения: -1.79E + 308 до 1.79E + 308)
  • Реальный: 4 байта (значения: -3.40E + 38 до 3.40E + 38)

Действительно ли разумно хранить значения цен в этих типах? Как насчет, например. INT?

  • Int: 4 байта (значения: -2,147,483,648 до 2,147,483,647)

Допустим, что в магазине используются доллары, у них есть центы, но я не вижу, чтобы цены составляли $49.2142342, поэтому использование большого количества десятичных знаков, показывающих центы, кажется пустой тратой пропускной способности SQL. Во-вторых, большинство магазинов не будут показывать цены около 200.000.000 (не в обычных интернет-магазинах, по крайней мере, если кто-то не пытается продать мне знаменитую башню в Париже)

Так почему бы не пойти на int?

int быстрый, его только 4 байта, и вы можете легко сделать десятичные числа, сохраняя значения в центах вместо долларов, а затем делитесь, когда вы представляете значения.

Другим подходом было бы использование smallmoney, который также составляет 4 байта, но для этого потребуется, чтобы математическая часть ЦП выполняла вычисление, где, поскольку Int является целочисленной мощностью... с нижней стороны, вам нужно будет разделить все единственный результат.

Существуют ли какие-либо проблемы с "валютой" с региональными настройками при использовании smallmoney/money fields? что они будут передавать в С#/. NET?

Любые плюсы и минусы? Пойдите для целых цен или smallmoney или некоторых других?

Что говорит ваш опыт?

4b9b3361

Ответ 1

Если вы абсолютно уверены, что ваши номера всегда будут находиться в диапазоне smallmoney, используйте это, и вы можете сохранить несколько байтов. В противном случае я бы использовал money. Но помните, в наши дни хранение дешево. Дополнительные 4 байта более 100 миллионов записей по-прежнему составляют менее половины ГБ. Однако @marc_s указывает, используя smallmoney, если вы можете уменьшить объем памяти SQL-сервера.

Короче говоря, если вы можете уйти с smallmoney, сделайте. Если вы считаете, что можете переместиться максимум, используйте money.

Но не используйте тип с плавающей запятой или вы получите проблемы округления и начнете проигрывать или получать случайные центы, если вы не справитесь с ними должным образом.

Мой аргумент против использования int: зачем изобретать колесо, сохраняя int, а затем нужно помнить, чтобы разделить на 100 (10000), чтобы получить значение и умножить обратно, когда вы идете, чтобы сохранить значение. Я понимаю, что типы денег используют int или long как базовый тип хранилища.

Что касается соответствующего типа данных в .NET, это будет decimal (что также позволит избежать проблем округления в коде С#).

Ответ 3

ИСПОЛЬЗУЙТЕ ЧИСЛЕННЫЙ/ДЕЦИМАЛЬНЫЙ. Избегайте ДЕНЬГИ /SMALLMONEY. Вот пример того, почему. Рано или поздно типы MONEY/SMALLMONEY, скорее всего, подведут вас из-за ошибок округления. Типы денег полностью избыточны и не приносят ничего полезного - сумма валюты представляет собой просто еще одно десятичное число, как и любое другое.

Наконец, типы MONEY/SMALLMONEY являются собственностью Microsoft. NUMERIC/DECIMAL являются частью стандарта SQL. Они используются, распознаются и понимаются многими людьми и поддерживаются большинством СУБД и другого программного обеспечения.

Ответ 4

Лично я бы использовал smallmoney или деньги, чтобы хранить цены на магазин.

Использование int добавляет сложности в другом месте.

И 200 миллионов - это действительно действительная цена в корейских вон или индонезийских рупиях тоже...

Ответ 5

Типы данных SQL money и smallmoney оба разрешаются с помощью С# decimal type:

http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqlmoney(v=VS.71).aspx

Итак, я думаю, что вы могли бы пойти и на decimal. Лично я использую double всю свою жизнь в финансовой отрасли и не испытываю проблем с производительностью и т.д. На самом деле, я обнаружил, что для определенных вычислений и т.д., Имея больший тип данных, допускает более высокую степень точности.

Ответ 6

Я бы пошел за типом данных Money. Invididually вы не можете превышать значение в Smallmoney, но было бы легко, если несколько элементов превысят его.

Ответ 7

В моем приложении ломбарды операторы ломбарда предоставляют от 5,00 долларов США до 10 000,00 долларов США Когда они рассчитывают сумму кредита, они округляют ее до ближайшего доллара, чтобы избегать сделок с центами (то же самое относится и к процентным платежам). Когда сумма кредита превышает 50 долларов США, они будут округлять ее до ближайших 5,00 долларов США (т.е. 50 долларов США, 55 долларов США, 60 долларов США...), опять же, чтобы свести к минимуму неисполнение долларовых банкнот. Поэтому я использую DECIMAL (7,2) для transaction.calculated_loan_amount и DECIMAL (5,0) для transaction.loan_amount. Приложение рассчитывает сумму кредита на копейки и помещает эту сумму в loan_amount, где она округляется до ближайшего доллара, когда ниже 50 долларов США или до ближайших 5,00 долларов США, когда больше.