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

Проверка работоспособности: плавает как первичный ключ?

Я работаю со старой базой данных sql server 2000, смешивая часть этой информации с новым приложением, которое я создаю. Я заметил, что некоторые из основных ключей в нескольких таблицах - это float, а не любые типы int. Они не являются иностранными ключами и все они уникальны. Я не могу думать о какой-либо причине, по которой кто-то хотел бы, чтобы их уникальные идентификаторы первичных ключей плавали, но я не эксперт SQL каким-либо образом. Поэтому я предполагаю, что я спрашиваю, не знает ли кто-нибудь, кто проектировал эту довольно обширную базу данных, что-то, чего я не делаю?

4b9b3361

Ответ 1

В настоящее время я работаю с довольно крупным пакетом бухгалтеров, где EACH из 350 + таблиц имеет первичный ключ FLOAT (53). Все фактические значения являются целыми числами, и система строго проверяет, действительно ли они есть (существуют специальные функции, выполняющие все дополнительные операции).

Я действительно задавался вопросом об этом дизайне, но я могу понять, почему он был выбран и дать ему несколько кредитов. С одной стороны, система достаточно велика, чтобы иметь несколько записей в нескольких таблицах. С другой стороны, эти первичные ключи должны легко читаться из внешних приложений, таких как Excel или VB6, и в этом случае вы не хотите делать их BIGINT.

Следовательно, float отлично.

Ответ 2

Я работал с кем-то, кто использовал float как PK в базах данных SQL Server. Он беспокоился о нехватке номеров для идентификаторов, если он придерживался INT. (32 бит на SQL Server.) Он просто посмотрел на диапазон float и не думал о том, что на самом деле не стоит забывать, что для больших номеров одно место не удерживается в числе, из-за ограниченной точности. Поэтому его код для MAX (PK) + 1.0 в какой-то момент возвращает число, равное MAX (PK). Нехорошо. Я, наконец, убедил его не использовать float для суррогатных первичных ключей для будущих баз данных. Он ушел, прежде чем исправлять базу данных, над которой он работал.

Чтобы ответить на ваш вопрос: "Итак, я думаю, что я спрашиваю, не знает ли кто-нибудь, кто проектировал эту довольно обширную базу данных, что-то, чего я не знаю?" Скорее всего НЕТ! По крайней мере, не в отношении выбора типов данных.

Ответ 3

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

Ответ 4

Является ли это ЧИСЛЕННЫМ (x, y) и IDENTITY? Если это так, это может быть обновление от более старой версии SQL Server. ИДЕНТИФИКАЦИЯ "назад в день" может быть только ЧИСЛЕННЫМ, а не общим INT, который мы используем сегодня.

В противном случае нет способа определить, подходит ли поплавок в качестве первичного ключа - это зависит от вашего домена. Это немного сложнее сравнить (IEEE INT более эффективен, чем float), и большинство людей используют монотонно увеличивающиеся числа (IDENTITY), поэтому целые числа часто являются тем, что действительно хотят люди.

Так как похоже, что вы сохраняете ints:

Чтобы ответить на исходный вопрос более непосредственно: если вы храните ints, используйте целочисленный тип данных. Это более эффективно хранить и сравнивать.

Ответ 5

Я работаю с базой данных Cerner Millenium в течение нескольких лет (под обложками использует Oracle). Первоначально я был очень удивлен, увидев, что он использовал float для идентификаторов на таблицах. Затем я встретил идентификатор в нашей базе данных > 2 ^ 32, и запрос, который я написал, дал неверные результаты, потому что я неправильно передал его в INT, я понял, почему он это сделал. Я не могу найти ни одного из приведенных выше аргументов против использования плавающих в реальном мире, в которых для ключей вам просто нужны цифры "несколько больше", чем 2 ^ 32, а значение идентификатора всегда имеет вид #### ##. 0. (Никто не говорит об идентификаторе формы ######. ######.) Однако теперь, когда мы импортируем эти данные в хранилище SQL Server, а bigint доступен, мы собираемся пойти с bigint вместо float.

Ответ 6

FYI - есть еще один способ взглянуть на это:

Я работаю в режиме управления в режиме реального времени, и поэтому большинство моих записей строк основаны на времени и автоматически генерируются автоматически с помощью машин, отличных от ASCII. время, которое мои пользователи обычно ищут, и многие из моих "пользователей" на самом деле являются самими машинами. Следовательно, первичные ключи на основе UTC.