Зачем кому-то использовать числовой (12, 0) тип данных для столбца простого целочисленного идентификатора? Если у вас есть причина, почему это лучше, чем int или bigint, я хотел бы ее услышать.
Мы не делаем никаких математических расчетов в этом столбце, это просто идентификатор, используемый для связывания внешнего ключа.
Я составляю список ошибок программирования и проблем с производительностью продукта и хочу быть уверенным, что они этого не сделали по какой-то логической причине. Если вы перейдете по этой ссылке: http://msdn.microsoft.com/en-us/library/ms187746.aspx
... вы можете видеть, что числовой (12, 0) использует 9 байтов памяти и ограничен 12 цифрами, всего 2 триллиона чисел, если вы включаете отрицательные числа. ПОЧЕМУ человек будет использовать это, если он может использовать bigint и получить в 10 миллионов раз больше чисел с на один байт меньше памяти. Кроме того, поскольку он используется в качестве идентификатора продукта, 4 миллиардов чисел стандартного int было бы более чем достаточно.
Так что, прежде чем я возьму факелы и вилы, скажите мне, что они собираются сказать в свою защиту?
И нет, я не делаю ничего особенного из ничего, в программном обеспечении есть сотни подобных проблем, и все это вызывает огромные проблемы с производительностью и использует слишком много места в базе данных. И мы заплатили более миллиона долларов за это дерьмо ... так что я отношусь к этому довольно серьезно.


В вашем примере я не могу придумать никакой логической причины, по которой вы бы не использовали INT. Я знаю, что, вероятно, есть причины для другого использования чисел, но не в этом случае.
По данным: http://doc.ddart.net/mssql/sql70/da-db_1.htm
decimal
Fixed precision and scale numeric data from -10^38 -1 through 10^38 -1.
numeric
A synonym for decimal.
int
Integer (whole number) data from -2^31 (-2,147,483,648) through 2^31 - 1 (2,147,483,647).
Невозможно узнать, есть ли причина для использования десятичных чисел, поскольку у нас нет кода, на который можно было бы смотреть.
Отрицательные числа - это целые числа, у них нет дробной части. По большинству определений они не являются «счетными числами», но являются целыми.
Термин целое число используется различными авторами для обозначения натурального числа, которое может быть либо: неотрицательными целыми числами (0, 1, 2, 3, ...), либо положительными целыми числами (1, 2, 3, ...)
Есть много причин использовать числовые данные - например, финансовые данные и другие данные, которые должны быть точными до определенных десятичных знаков. Однако для приведенного выше примера подойдет простой int.
Возможно, работают неряшливые программисты, не умеющие проектировать базу данных?
В некоторых базах данных использование десятичной дроби (10,0) создает упакованное поле, которое занимает меньше места. Я знаю, что в моей работе есть много таблиц, в которых это используется. Вероятно, здесь у них были такие же мысли, но вы просмотрели документацию и доказали, что это неверно. Скорее всего, я бы сказал, что это будет сводиться к случаю, «так мы всегда это делали, потому что кто-то однажды сказал, что это лучше».
Прежде чем вы относитесь к вещам слишком серьезно, каковы требования к хранилищу данных для каждой строки или набора строк для этого элемента?
Ваше наблюдение верное, но вы, вероятно, не захотите представлять его слишком сильно, если, например, вы сокращаете объем хранилища с 5000 до 4090 байтов.
Вы не хотите подорвать доверие к себе, поднимая этот вопрос и заставляя их указывать на то, что любая измеримая экономия ничтожна. («Конечно, многие из наших менее опытных сотрудников также совершают ту же ошибку».)
Можете ли вы заполнить эти пробелы?
with the data type change, we use
____ bytes of disk space instead of ____
____ ms per query instead of ____
____ network bandwidth instead of ____
____ network latency instead of ____
Это то, что вселяет в вас доверие.
Поскольку этот идентификационный код копируется во многие таблицы, используется в запросах API и используется для объединений, это не просто вопрос сохранения одного байта на строку - это вопрос сохранения данных в индексах, оптимизации объединений, уменьшения сетевых накладных расходов, так далее...
Точно. Определите это количественно, и вы получите веские аргументы в пользу своего решения. возражения, которые я сделал, были лишь примерами возражений, которые вы могли услышать и на которые должны быть готовы ответить.
Возможно, они проводят много времени в MS Access и часто видят «Число» и просто прикидывают, это число, почему бы не использовать числовое?
Судя по вашим выводам, это не похоже на то, что они эксперты по оптимизации, и они просто не знали. Мне интересно, использовали ли они инструменты генерации схем и слишком ли полагались на них.
Интересно, насколько эффективен индекс для десятичного значения (даже если установлен масштаб 0) для первичного ключа по сравнению с чистым целочисленным значением.
Как сказал Марк Х., помимо фактора индексации, этот конкретный сценарий, скорее всего, не ТАКОЕ увеличивает базу данных, но если вы ищете боеприпасы, я думаю, вы действительно нашли некоторые, чтобы их принизить.
У меня есть много ошибок, на которые я уверен. Это просто стало таким сюрпризом, что это одна из тех вещей, «у которых должна быть причина». I.E. это настолько странно, что должно быть сделано специально.
Сколько лет этому приложению, которое вы изучаете?
До SQL Server 2000 не было bigint. Может быть, это просто что-то, что доставлялось от выпуска к выпуску в течение многих лет без изменений, или схема базы данных была скопирована из приложения, которое было таким старым?!?
Это новинка со времен SQL 2000. Однако возможно, что база данных основана на какой-то более старой конструкции, но это будет означать, что они продали нам что-то не то, что они сказали.
Может, они привыкли работать с Oracle?
Все числовые типы, включая целые числа, нормализованы до стандартного единого представления для всех платформ.
Бум идет динамит :) Очевидно, старая версия этой базы данных была Oracle.
В вашей цитате десятичная дробь показывает точность от 1 до 9 при использовании 5 байтов. Ваш столбец, по-видимому, имеет 12,0 - используя 4 байта памяти - то же самое, что и целое число.
Более того, INT, тип данных может достигать степени 31: От -2 ^ 31 (-2,147,483,648) до 2 ^ 31-1 (2,147,483,647)
В то время как десятичная дробь намного больше 38: - от 10 ^ 38 +1 до 10 ^ 38 - 1
Таким образом, создатель программного обеспечения фактически предоставил больше при использовании того же объема дискового пространства.
Теперь, когда основы разложены, создатель программного обеспечения фактически ограничился всего 12 числами или 123 456 789 012 (просто пример для владельцев мест, а не максимальное число). Если бы они использовали INT, они не смогли бы масштабировать этот столбец - он увеличился бы до 31 цифры. Возможно, есть коммерческая причина ограничить этот столбец и связанные столбцы 12 цифрами.
INT - это INT, а DECIMAL - скаляр.
Надеюсь это поможет.
PS: Аргумент целого числа: А) Целые числа равны 0 .. бесконечность. Б) Счетные (натуральные) числа равны 1 ... бесконечность. C) Целые числа - бесконечность (отрицательная) .. бесконечность (положительная) Г) Я бы ни за что не цитировал WikiANYTHING. Давай, используйте настоящий источник! Также может быть http://MyPersonalMathCite.com
? Согласно документации Microsoft по t-sql (ссылка предоставлена исходным плакатом), точность 12,0 занимает 9 байтов, а не 4.
Странно, что ints относятся к "целым числам", когда им разрешено быть отрицательными.