Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 float для идентификаторов  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54191
Разбираюсь с поставляемой нам сторонней БД, откуда потом придется данные качать в наши системы
БД, судя по всему, что-то типа code first -- ни одного ни ключа, ни триггера, ни ХП - все делается через ПО; на БД ничего кроме таблиц

+
SELECT SchemaName = c.table_schema,
       TableName = c.table_name,
       ColumnName = c.column_name,
       DataType = data_type
  FROM information_schema.columns c
  JOIN information_schema.tables t
    ON c.table_name = t.table_name
   AND c.table_schema = t.table_schema
   AND t.table_type = 'BASE TABLE'
where data_type = 'float'
   and c.column_name like '%id'
 ORDER BY
       SchemaName,
       TableName,
       ordinal_position

запрос из all_columns выдает полторы сотни полей, у которых тип float и названия типа CATALOG_ID, CONTRACT_ID, ITEM_ID и т.д.

Меня это смущает
но т.к. в MSSQL у меня опыт небольшой, спрошу - насколько это допустимо? Стоит ли лезть в бутылку и требовать bigint, или это некритично?
17 ноя 18, 14:10    [21736995]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
iap
Member

Откуда: Москва
Сообщений: 46978
andreymx,

сравнивать два числа float оператором = некорректно, а именно это и предполагают понятия PRIMARY KEY и FOREIGN KEY.
Я думаю, что от float в ключах надо уходить. Говнокод-с!
17 ноя 18, 14:23    [21736998]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33672
Блог
andreymx,

очевидно же, что один и тот же запрос на абсолютно тех же данных может вернуть разный результат,
я бы порекомендовал разорвать всякие отношения с поставщиком такого г
17 ноя 18, 14:24    [21736999]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54191
задам вопрос поставщику
17 ноя 18, 14:25    [21737000]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7762
andreymx,

float - приближённый формат хранения числа.
17 ноя 18, 14:26    [21737001]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7762
Согласен с предыдущими ораторами, если поставщик столь небрежно относится к решениям, то лучше разорвать с ним всякие отношения.
17 ноя 18, 14:28    [21737002]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
iap
Member

Откуда: Москва
Сообщений: 46978
Владислав Колосов
andreymx,

float - приближённый формат хранения числа.
Смотря как понимать приближённость.
Хранит-то он абсолютно точно.
Просто не все числа изначально могут храниться в этом формате.
Компьютер переданное значение вынужден слегка подправлять при сохранении в регистре процессора.
Поэтому он сохраняет не то, что ему передали, а мы пытаемся сравнивать именно с этим и - неудачно.
17 ноя 18, 14:35    [21737007]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
aleks222
Member

Откуда:
Сообщений: 961
iap
andreymx,

сравнивать два числа float оператором = некорректно, а именно это и предполагают понятия PRIMARY KEY и FOREIGN KEY.
Я думаю, что от float в ключах надо уходить. Говнокод-с!

Да ладно те.
4*8 бит float ничем не хуже 64 бит bigint.
17 ноя 18, 15:08    [21737016]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
aleks222
Member

Откуда:
Сообщений: 961
iap
Владислав Колосов
andreymx,

float - приближённый формат хранения числа.
Смотря как понимать приближённость.
Хранит-то он абсолютно точно.
Просто не все числа изначально могут храниться в этом формате.
Компьютер переданное значение вынужден слегка подправлять при сохранении в регистре процессора.
Поэтому он сохраняет не то, что ему передали, а мы пытаемся сравнивать именно с этим и - неудачно.


Когнитивный диссонанс.
Сравнивать надо уметь!

[он сохранил] = cast( [переданное значение] as float )


и шоколад обеспечен.
17 ноя 18, 15:11    [21737019]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 308
Всё понимают, что это плохо, но "Баба Яга просто из принципа против" :D
18 ноя 18, 00:24    [21737212]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
aleks222
4*8 бит float ничем не хуже 64 бит bigint.

aleks222
Сравнивать надо уметь!
[он сохранил] = cast( [переданное значение] as float )

и шоколад обеспечен.
Конечно, float ничем не хуже 64 бит bigint, но тогда при сравнениях нужно гарантировать, что значения сравниваются бит-в-бит.
А при любом cast это не гарантируется, потому что cast может отличаться от того cast, который использовался при сохранении [он сохранил].

ИМХО такое - однозначный признак полной некомпетентности поставщика, это даже не "недостаток", а однозначная непригодность.
Потому что, даже если сложатся все звёзды, и сравнение будет корректным, возникает вопрос - зачем? зачем вместо bigint использовать float, и думать про все эти сравнения, какой профит такое решение принесёт клиенту?

Очевидно, уровень разработчиков поставщика, а так же их уровень постановки процессов, не предполагает углубление в такие дебри; очевидно, при рисовании базы мышкой в аксесе (или при экспорте из тексового файла тулзой и т.п.) прога предложила для ИД-полей тип "число", и этот тип из проги трансформировался во float, ну так сложилось, "а чо таково?"
18 ноя 18, 15:01    [21737431]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
iap
Member

Откуда: Москва
Сообщений: 46978
Повторюсь: IEEE754-тика угрожает человечеству
18 ноя 18, 18:37    [21737498]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
uaggster
Member

Откуда:
Сообщений: 827
Пусть переделают float на numeric и наслаждаются.
numeric - тип с фиксированной точностью (с фиксированной запятой), и фактически является целочисленным.

Видел проект, в котором все id были numeric(24,0)
Ничего, живут. И даже вполне себе развиваются.

На вопрос - к чему такой дебилизм, отвечаю:
Они формируют идешники на клиенте, по своей проприетарной формуле - регион + дата + тип операции + что-то там + номер по порядку из очереди.
Короче, 24 цифры и выходит. В другие типы - не влазит.

Они художники, они так видят...
19 ноя 18, 08:18    [21737758]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54191
пообщался
сижу в шоке

подробности письмом :)
19 ноя 18, 10:39    [21737855]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
uaggster
Пусть переделают float на numeric и наслаждаются.
numeric - тип с фиксированной точностью (с фиксированной запятой), и фактически является целочисленным.

Видел проект, в котором все id были numeric(24,0)
Ничего, живут. И даже вполне себе развиваются.
Да, такое бывает, это в принципе наследие неких легаси, где целое стандартно определяли как NUMERIC(xx, 0)
uaggster
Короче, 24 цифры и выходит. В другие типы - не влазит.
Да, 24 даже в bigint не влезет...

Но это тоже узнаваемо. Нередко идентификаторы вообще делали как строку, сформированную по определённым правилам, а тут число, уже легче для сервера.
andreymx
пообщался
сижу в шоке

подробности письмом :)
Намекните хоть, а то заинтриговали, и вот, на самом интересном месте... :-)
19 ноя 18, 11:01    [21737883]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1809
andreymx
тип float и названия типа CATALOG_ID, CONTRACT_ID, ITEM_ID и т.д


И что, реально в данных дробная часть сидит?

Все-таки хочется верить в человечество, поэтому предполагаю, что в данных только целая часть, что тип изменен по ошибке, на каком-то этапе миграции(конвертации). Исправить обратно в int и забыть.
19 ноя 18, 11:08    [21737894]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54191
пошел учить термин "реконсиляция"
19 ноя 18, 11:11    [21737898]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
andreymx
пошел учить термин "реконсиляция"

это они uniqueidentifier заменили каким-то синтетическим float?
19 ноя 18, 11:16    [21737906]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
andreymx
пошел учить термин "реконсиляция"
Непонятно, как связана "реконсиляция" и использование float для идентификаторов.
Не сомневайтесь в их некомпетентности, не дайте запудрить себе мозги :-)
19 ноя 18, 11:38    [21737941]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54191
TaPaK
andreymx
пошел учить термин "реконсиляция"

это они uniqueidentifier заменили каким-то синтетическим float?
пока разбираемся


select 
    t.name as TableWithForeignKey, 
    fk.constraint_column_id as FK_PartNo, c.
    name as ForeignKeyColumn 
from 
    sys.foreign_key_columns as fk
inner join 
    sys.tables as t on fk.parent_object_id = t.object_id
inner join 
    sys.columns as c on fk.parent_object_id = c.object_id and fk.parent_column_id = c.column_id
order by 
    TableWithForeignKey, FK_PartNo


select *
  from sys.foreign_key_columns as fk
эти запросы ничего не возвращают
19 ноя 18, 11:41    [21737950]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
andreymx
эти запросы ничего не возвращают
Ну, это они просто не делали FK, бывает.

Вообще, по всем признакам (реконсиляция, отсутствие ФК, float для идентификаторов), базу делали люди, которые, возможно, высококвалифицированные разработчики, но с нулевыми знаниями в СУБД.
Соответственно, даже если вы там совместно что то поковыраете, и оно заработает, к нормальной эксплуатации база будет непригодна, в связи с многочисленными заложенными бомбами кривизны.
Так что вам либо нужно изучать СУДБ, и брать всё это под свой жёсткий контроль, либо стараться держаться подальше от этой системы.
19 ноя 18, 12:08    [21738005]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54191
alexeyvg,

не хочу никого критиковать, пока не разберусь сам
19 ноя 18, 12:27    [21738037]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7762
andreymx,

очевидно, что какую бы конструкцию велосипеда ни придумали, лучшая уже существует.
19 ноя 18, 13:34    [21738117]     Ответить | Цитировать Сообщить модератору
 Re: float для идентификаторов  [new]
aleks222
Member

Откуда:
Сообщений: 961
Владислав Колосов
andreymx,

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


Когнитивный диссонанс.

Сначала была конструкция лисапеда похуже.
Потом придумали современную конструкцию.
Нет никаких оснований считать, что невозможно придумать еще лучше.
19 ноя 18, 17:04    [21738352]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить