Я задаюсь вопросом, каков лучший тип для ценового поля в SQL Server для подобной магазину структуры?
Рассмотрение этого обзора, у нас есть типы данных, названные деньгами, smallmoney, затем мы имеем десятичный/числовой и наконец плаваем и реальный.
Имя, память/использование диска и диапазоны значений:
Это действительно мудро к значениям цены в магазине в тех типах? Что относительно, например, INT?
Позволяет говорят, что магазин использует доллары, у них есть центы, но я не вижу, что цены 49,2142342$ так использование большого количества десятичных чисел, показывающих, что центы кажутся тратой пропускной способности SQL. Во-вторых, большинство магазинов не показало бы цен около 200.000.000 (не в нормальных интернет-магазинах, по крайней мере, если кто-то не пытается продать мне известную башню в Париже),
Итак, почему бы не пойти для интервала?
Интервал быстр, его только 4 байта, и можно легко сделать десятичные числа, путем сохранения значений в центах вместо долларов и затем разделиться при представлении значений.
Другой подход должен был бы использовать smallmoney, который составляет 4 байта также, но это потребует, чтобы математическая часть ЦП сделала calc, где, поскольку Интервал является целочисленным питанием... на оборотной стороне, необходимо будет разделить каждый результат.
Есть ли какие-либо связанные с "валютой" проблемы с региональными настройками при использовании smallmoney/money полей? что они передадут также в C#/.NET?
Какие-либо профессионалы/недостатки? Пойти за целочисленные цены или smallmoney или некоторого другого?
Что говорит Ваш опыт?
Если вы абсолютно уверены, что ваши числа всегда будут находиться в диапазоне smallmoney
, используйте его, и вы сможете сэкономить несколько байт. В противном случае я бы использовал money
. Но помните, что в наши дни хранение данных стоит дешево. Дополнительные 4 байта на 100 миллионов записей - это все равно меньше, чем полгигабайта. Однако, как отмечает @marc_s, использование smallmoney
, если вы можете, уменьшит объем памяти SQL-сервера.
Короче говоря, если вы можете обойтись без smallmoney
, сделайте это. Если вы думаете, что можете превысить максимальное значение, используйте money
.
Но не используйте плавающий десятичный тип, иначе возникнут проблемы с округлением и вы начнете терять или набирать случайные центы, если не справитесь с ними должным образом.
Мой аргумент против использования int
: Зачем изобретать колесо, храня int
, а затем помнить о необходимости деления на 100 (10000) для получения значения и обратного умножения, когда вы собираетесь сохранить значение. Насколько я понимаю, типы денег в любом случае используют int
или long
в качестве базового типа хранения.
Что касается соответствующего типа данных в .NET, то это будет decimal
(что также позволит избежать проблем с округлением в коде C#).
ИСПОЛЬЗУЙТЕ ЦИФРОВЫЕ / ДЕСЯТИЧНЫЕ. Избегайте ДЕНЬГИ / МАЛЕНЬКИЕ ДЕНЬГИ. Вот пример того, почему . Рано или поздно типы MONEY / SMALLMONEY, скорее всего, подведут вас из-за ошибок округления. Типы денег полностью избыточны и не дают ничего полезного - денежная сумма является просто еще одним десятичным числом, как и любое другое.
Наконец, типы MONEY / SMALLMONEY являются собственностью Microsoft. NUMERIC / DECIMAL являются частью стандарта SQL. Они используются, распознаются и понимаются большим количеством людей и поддерживаются большинством СУБД и другим программным обеспечением.
Используйте тип данных Деньги , если вы храните деньги (если не моделируете огромные суммы денег, такие как государственный долг) - это позволяет избежать проблем с точностью / округлением.
Я бы выбрал тип данных Money. Непредвиденно вы не можете превышать значение Smallmoney, но для нескольких элементов будет легко превысить его.
SQL типы данных money
и smallmoney
оба разрешаются в c# decimal
type:
http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqlmoney(v=VS.71).aspx
Так что я думаю, что вы можете выбрать decimal
. Лично я использую double
всю свою жизнь, работая в финансовой индустрии, и не испытывал проблем с производительностью и т.д. На самом деле, я обнаружил, что для определенных вычислений и т.д. наличие большего типа данных позволяет достичь более высокой степени точности.
Лично я бы использовал smallmoney или money для хранения цен в магазине.
Использование int добавляет сложности в других местах.
И 200 миллионов - вполне приемлемая цена в корейских вонах или индонезийских рупиях...
В моем приложении "Ломбард" операторы ломбарда выдают займы от $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, если больше.