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

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

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

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

  • Деньги: 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)
  • Плавание: 8 байтов (значения:-1.79E+308 к 1.79E+308)
  • Реальный: 4 байта (значения:-3.40E+38 к 3.40E+38)

Это действительно мудро к значениям цены в магазине в тех типах? Что относительно, например, INT?

  • Интервал: 4 байта (значения:-2 147 483 648 к 2,147,483,647)

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

Итак, почему бы не пойти для интервала?

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

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

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

Какие-либо профессионалы/недостатки? Пойти за целочисленные цены или smallmoney или некоторого другого?

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

29
задан halfer 14 December 2013 в 22:16
поделиться

7 ответов

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

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

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

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

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

22
ответ дан 28 November 2019 в 01:42
поделиться

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

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

7
ответ дан 28 November 2019 в 01:42
поделиться

Используйте тип данных Деньги , если вы храните деньги (если не моделируете огромные суммы денег, такие как государственный долг) - это позволяет избежать проблем с точностью / округлением.

Многочисленные преимущества денег… Тип данных!

9
ответ дан 28 November 2019 в 01:42
поделиться

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

1
ответ дан 28 November 2019 в 01:42
поделиться

SQL типы данных money и smallmoney оба разрешаются в c# decimal type:

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

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

3
ответ дан 28 November 2019 в 01:42
поделиться

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

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

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

4
ответ дан 28 November 2019 в 01:42
поделиться

В моем приложении "Ломбард" операторы ломбарда выдают займы от $5.00 до $10,000.00. При расчете суммы займа они округляют ее до ближайшего доллара, чтобы избежать работы с центами (то же самое относится и к процентным платежам). Когда сумма кредита превышает $50.00, они округляют ее до ближайших $5.00 (т.е. $50, $55, $60 ...), опять же, чтобы минимизировать нехватку долларовых купюр. Поэтому я использую DECIMAL(7,2) для transaction.calculated_loanan_amount и DECIMAL(5,0) для transaction.loan_amount. Приложение рассчитывает сумму кредита до копейки и помещает ее в loan_amount, где она округляется до ближайшего доллара, если сумма меньше $50, или до ближайшего $5.00, если больше.

0
ответ дан 28 November 2019 в 01:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: