Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / float для идентификаторов / 24 сообщений из 24, страница 1 из 1
17.11.2018, 14:10
    #39734529
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
Разбираюсь с поставляемой нам сторонней БД, откуда потом придется данные качать в наши системы
БД, судя по всему, что-то типа code first -- ни одного ни ключа, ни триггера, ни ХП - все делается через ПО; на БД ничего кроме таблиц

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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, или это некритично?
...
Рейтинг: 0 / 0
17.11.2018, 14:23
    #39734531
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
andreymx,

сравнивать два числа float оператором = некорректно, а именно это и предполагают понятия PRIMARY KEY и FOREIGN KEY.
Я думаю, что от float в ключах надо уходить. Говнокод-с!
...
Рейтинг: 0 / 0
17.11.2018, 14:24
    #39734532
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
andreymx,

очевидно же, что один и тот же запрос на абсолютно тех же данных может вернуть разный результат,
я бы порекомендовал разорвать всякие отношения с поставщиком такого г
...
Рейтинг: 0 / 0
17.11.2018, 14:25
    #39734533
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
задам вопрос поставщику
...
Рейтинг: 0 / 0
17.11.2018, 14:26
    #39734534
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
andreymx,

float - приближённый формат хранения числа.
...
Рейтинг: 0 / 0
17.11.2018, 14:28
    #39734535
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
Согласен с предыдущими ораторами, если поставщик столь небрежно относится к решениям, то лучше разорвать с ним всякие отношения.
...
Рейтинг: 0 / 0
17.11.2018, 14:35
    #39734537
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
Владислав Колосовandreymx,

float - приближённый формат хранения числа.Смотря как понимать приближённость.
Хранит-то он абсолютно точно.
Просто не все числа изначально могут храниться в этом формате.
Компьютер переданное значение вынужден слегка подправлять при сохранении в регистре процессора.
Поэтому он сохраняет не то, что ему передали, а мы пытаемся сравнивать именно с этим и - неудачно.
...
Рейтинг: 0 / 0
17.11.2018, 15:08
    #39734544
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
iapandreymx,

сравнивать два числа float оператором = некорректно, а именно это и предполагают понятия PRIMARY KEY и FOREIGN KEY.
Я думаю, что от float в ключах надо уходить. Говнокод-с!
Да ладно те.
4*8 бит float ничем не хуже 64 бит bigint.
...
Рейтинг: 0 / 0
17.11.2018, 15:11
    #39734547
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
iapВладислав Колосовandreymx,

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

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

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



и шоколад обеспечен.
...
Рейтинг: 0 / 0
18.11.2018, 00:24
    #39734666
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
Всё понимают, что это плохо, но "Баба Яга просто из принципа против" :D
...
Рейтинг: 0 / 0
18.11.2018, 15:01
    #39734795
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
aleks2224*8 бит float ничем не хуже 64 бит bigint.
aleks222Сравнивать надо уметь!
Код: sql
1.
[он сохранил] = cast( [переданное значение] as float )


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

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

Очевидно, уровень разработчиков поставщика, а так же их уровень постановки процессов, не предполагает углубление в такие дебри; очевидно, при рисовании базы мышкой в аксесе (или при экспорте из тексового файла тулзой и т.п.) прога предложила для ИД-полей тип "число", и этот тип из проги трансформировался во float, ну так сложилось, "а чо таково?"
...
Рейтинг: 0 / 0
18.11.2018, 18:37
    #39734830
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
...
Рейтинг: 0 / 0
19.11.2018, 08:18
    #39734933
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
Пусть переделают float на numeric и наслаждаются.
numeric - тип с фиксированной точностью (с фиксированной запятой), и фактически является целочисленным.

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

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

Они художники, они так видят...
...
Рейтинг: 0 / 0
19.11.2018, 10:39
    #39734992
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
пообщался
сижу в шоке

подробности письмом :)
...
Рейтинг: 0 / 0
19.11.2018, 11:01
    #39735008
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
uaggsterПусть переделают float на numeric и наслаждаются.
numeric - тип с фиксированной точностью (с фиксированной запятой), и фактически является целочисленным.

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

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

подробности письмом :)Намекните хоть, а то заинтриговали, и вот, на самом интересном месте... :-)
...
Рейтинг: 0 / 0
19.11.2018, 11:08
    #39735017
Cane Cat Fisher
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
andreymxтип float и названия типа CATALOG_ID, CONTRACT_ID, ITEM_ID и т.д

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

Все-таки хочется верить в человечество, поэтому предполагаю, что в данных только целая часть, что тип изменен по ошибке, на каком-то этапе миграции(конвертации). Исправить обратно в int и забыть.
...
Рейтинг: 0 / 0
19.11.2018, 11:11
    #39735021
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
пошел учить термин "реконсиляция"
...
Рейтинг: 0 / 0
19.11.2018, 11:16
    #39735026
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
andreymxпошел учить термин "реконсиляция"
это они uniqueidentifier заменили каким-то синтетическим float?
...
Рейтинг: 0 / 0
19.11.2018, 11:38
    #39735042
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
andreymxпошел учить термин "реконсиляция"Непонятно, как связана "реконсиляция" и использование float для идентификаторов.
Не сомневайтесь в их некомпетентности, не дайте запудрить себе мозги :-)
...
Рейтинг: 0 / 0
19.11.2018, 11:41
    #39735049
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
TaPaKandreymxпошел учить термин "реконсиляция"
это они uniqueidentifier заменили каким-то синтетическим float?пока разбираемся


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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

эти запросы ничего не возвращают
...
Рейтинг: 0 / 0
19.11.2018, 12:08
    #39735075
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
andreymxэти запросы ничего не возвращаютНу, это они просто не делали FK, бывает.

Вообще, по всем признакам (реконсиляция, отсутствие ФК, float для идентификаторов), базу делали люди, которые, возможно, высококвалифицированные разработчики, но с нулевыми знаниями в СУБД.
Соответственно, даже если вы там совместно что то поковыраете, и оно заработает, к нормальной эксплуатации база будет непригодна, в связи с многочисленными заложенными бомбами кривизны.
Так что вам либо нужно изучать СУДБ, и брать всё это под свой жёсткий контроль, либо стараться держаться подальше от этой системы.
...
Рейтинг: 0 / 0
19.11.2018, 12:27
    #39735090
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
alexeyvg,

не хочу никого критиковать, пока не разберусь сам
...
Рейтинг: 0 / 0
19.11.2018, 13:34
    #39735122
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
andreymx,

очевидно, что какую бы конструкцию велосипеда ни придумали, лучшая уже существует.
...
Рейтинг: 0 / 0
19.11.2018, 17:04
    #39735237
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float для идентификаторов
Владислав Колосовandreymx,

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

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

Сначала была конструкция лисапеда похуже.
Потом придумали современную конструкцию.
Нет никаких оснований считать, что невозможно придумать еще лучше.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / float для идентификаторов / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]