Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
recvezitor
Member

Откуда: Владивосток
Сообщений: 419
В качестве уникального идентификатора предполагается будут выступать координаты, которые должны быть уникальны для таблицы. Идея в том чтобы использовать их в качестве составного (из двух координат) первичного ключа. Тут меня озадачили, что при переходе на новое железо, это новое железо может по другому проинтерпретировать числа с плавающей точкой. Очевидно, что сравнивать на равенство числа с плавающей точкой плохо, но не в этом случае. Если пользователь вводит число 143.1234 первый раз, то и во второй раз введя такое же число оно превыратится в аналогичное число с плавающей точкой и проверка на равенство даст истину. Так вот, будет ли разница если сервер переедет на другое железо, и что должно быть в другом железе другого, чтобы одно и то же число превратилось в не равное.
1 сен 11, 03:32    [11209869]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
recvezitor,

Вообще числа с плавующей точкой применять надо с сторожностью и там где это действительно нужно. Для координат LAT LON , X Y Z использовать соответствующий размерности DECIMAL или geography и geometry тип данных.
1 сен 11, 06:17    [11209891]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
aleks2
Guest
recvezitor
Так вот, будет ли разница если сервер переедет на другое железо, и что должно быть в другом железе другого, чтобы одно и то же число превратилось в не равное.


Чему нынче в ясельках учат?

ЛЮБЫЕ данные в компутере, включая REAL и FLOAT, суть порция битов фиксированной длины.
И какого хрена 32 (REAL) иль 64 (FLOAT) бита должны на другом компутере выглядеть иначе?
1 сен 11, 06:28    [11209894]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
recvezitor, не морочте голову, используйте суррогатный PK. Этим вы себе серьезно упростите жизнь и разработку.
1 сен 11, 08:42    [11209974]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
recvezitor
Member

Откуда: Владивосток
Сообщений: 419
Суррогатный ключ это лишнее поле, которое на треть увеличит таблицу. Там всего три колонки. Geography и geometry на сколько я знаю появились только в 2008r2? Чето немного палево их пользовать. Возможно самый разумный вариант это decimal с 7 знаками после запятой

aleks2
ЛЮБЫЕ данные в компутере, включая REAL и FLOAT, суть порция битов фиксированной длины.
И какого хрена 32 (REAL) иль 64 (FLOAT) бита должны на другом компутере выглядеть иначе?

Да я тоже так думал, но т.к. специальность не моя родная, с железом не работал, а тут человек вроде знающий (но уже у него спросить не получится), вот и засомневался.
1 сен 11, 09:35    [11210109]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
лучше обратиться к документации базы и найти, каким макаром она будет "сравнивать" на уникальность ключи. Ведь весь трюк именно в операции сравнения...не факт же, что не нормализованные числа с плавающей точкой будут между собой равны, 20.2 = 20.2..хотя это скорее ошибка не операции , а логики..
1 сен 11, 09:44    [11210146]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
recvezitor
Суррогатный ключ это лишнее поле, которое на треть увеличит таблицу.
4 байта на строку - это много? Не вижу никакой трети.
Географические координаты больше места занимают, чем intы
recvezitor
Там всего три колонки. Geography и geometry на сколько я знаю появились только в 2008r2?
Нет, в SQL2008
1 сен 11, 11:26    [11210888]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
recvezitor
Суррогатный ключ это лишнее поле, которое на треть увеличит таблицу. Там всего три колонки. Geography и geometry на сколько я знаю появились только в 2008r2? Чето немного палево их пользовать. Возможно самый разумный вариант это decimal с 7 знаками после запятой

aleks2
ЛЮБЫЕ данные в компутере, включая REAL и FLOAT, суть порция битов фиксированной длины.
И какого хрена 32 (REAL) иль 64 (FLOAT) бита должны на другом компутере выглядеть иначе?

Да я тоже так думал, но т.к. специальность не моя родная, с железом не работал, а тут человек вроде знающий (но уже у него спросить не получится), вот и засомневался.


Сильный ход - оценивать размер таблицы по количеству полей... Это было в-первых...

Во-вторых... К исходному вопросу... Из каких соображений выбран такой вариант ключа? И для чего он нужен?
Чтобы идентифицировать некоторый объект в пространстве? А как быть, если два однотипных объекта находятся в одной точке пространства? Первичный ключ, одно из требований к которому - уникальность, даст отлуп... Вы к этому готовы?
Ну, и с учетом того, что координаты объекта могут меняться, Вы себе представляете последствия для связанных данных?
1 сен 11, 11:39    [11211049]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
карась носогрыз
Guest
recvezitor
В качестве уникального идентификатора предполагается будут выступать координаты, которые должны быть уникальны для таблицы. Идея в том чтобы использовать их в качестве составного (из двух координат) первичного ключа.


это ошибка проектирования, которая аукнется очень быстро.
вам уже порекомендовали суррогат - это вполне себе выход и нормальная практика.
нужно ограничение уникальности - ну поставьте. это же не означает что именно по этим полям PK нужно делать.
1 сен 11, 11:55    [11211247]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
recvezitor
Member

Откуда: Владивосток
Сообщений: 419
Эта таблица называется батиметрия. У нее 3 поля координата X, координата Y и соответствующая этой паре координат глубина. Данные набираются исходя из данных получаемых эхолотом. Конечно теоретически (да и практически) возможны случаи когда судно проходит по одной и той же точке (с какой то точностью). Но суть таблицы именно в уникальности координат. Если в таблицу захотят добавить новую запись с существующими координатами, то тут 2 варианта:1) брать усреденное значение новой и существующей, 2) игнорировать новое значение в предположении что в базе только "четкие данные", а все что приходит или совпадает (с определенной точностью) или заведомо неверное.
Пока не вижу необходимости вводить дополнительное поле.
Ну возможно не треть, а меньше если три поля типа плавающей точки, а суррогат типа целое число.
1 сен 11, 15:03    [11212980]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
карась носогрыз
Guest
recvezitor,

первичный ключ предметной области не обязывает вас закладывать такой же pk для таблицы.

мое мнение: вам нужно ID точки измерения с такими-то координатами.

один из возможных рисков: замеры потребуется историровать. дублировать координаты в истории - бред, уникальность пошла лесом, нужна новая таблица, ссылка из которой будет на PK, если втянете в PK (координаты+дата замера), будет вобще лажа.

+если будете хранить точки измерений отдельно, то можно добавить вычисляемые столбцы с расчетными координатами при допустимом отклонении (xmin, ymin, xmax, ymax)

как вариант.
1 сен 11, 15:16    [11213119]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
карась носогрыз
Guest
предметная область вам, очевидно, понятна больше чем мне, вполне можно и три столбца оставить если там мега хранилище, только уникальность в терминах PK не описывайте.
1 сен 11, 15:25    [11213194]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
тмвыа
Guest
тип надо думать будет Numeric (x,y) - он железонезависим по любому. Но все таки суррогатный ключ нужен!!!!!
1 сен 11, 15:38    [11213365]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
ChA
Member

Откуда: Москва
Сообщений: 11314
BOL 2000
Numeric Data
...
Approximate Numeric Data
Approximate numeric (floating-point) data consists of data preserved as accurately as the binary numbering system can offer. Approximate numeric data is stored using the float and real data types in SQL Server. For example, because the fraction one-third in decimal notation is .333333 (repeating), this value cannot be represented precisely using approximate decimal data. Therefore, the value retrieved from SQL Server may not be exactly what was stored originally in the column. Additional examples of numeric approximations are floating-point values ending in .3, .6, and .7.
...
Грубо говоря, литерал указываете один, а значение полю будет присваиваться другое, сводимое к конкретному допустимому float. Отсюда проистекают нежелательные нюансы, связанные с присвоением и поиском. Оно Вам надо ? Лучше уж тогда с фиксированной точкой, как посоветовали выше.
1 сен 11, 16:49    [11214146]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
recvezitor
Эта таблица называется батиметрия. У нее 3 поля координата X, координата Y и соответствующая этой паре координат глубина. Данные набираются исходя из данных получаемых эхолотом.
Совершенно не понятно: зачем координаты хранить во float?
Диапазоны их значений известны, с какой точностью они могут быть вычислены - известно.
Чем decimal не устраивает?

Да и глубину тоже... Вы ее в микронах что ли измеряете?
1 сен 11, 17:17    [11214418]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
BVB_berserk
Member

Откуда:
Сообщений: 35
Сделайте PK int-ом (суррогатный), а для координат хоть три отдельных столбца X Y Z, после чего на этих трёх столбцах создайте ограничение UNIQUE - и всё. Получите уникальность координат.
1 сен 11, 17:23    [11214458]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
aleks2
Guest
BVB_berserk
Сделайте PK int-ом (суррогатный), а для координат хоть три отдельных столбца X Y Z, после чего на этих трёх столбцах создайте ограничение UNIQUE - и всё. Получите уникальность координат.


А типерь внимание! ВОПРОС: чем UNIQUE отличается от PK?
По существу тока.
1 сен 11, 17:29    [11214507]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
советую https://www.sql.ru/forum/actualthread.aspx?tid=335874

прежде чем связываться с float. очень познавательно между прочим)
там люди доходчиво объясняют где уместно юзать этот тип.
1 сен 11, 17:29    [11214510]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
BVB_berserk
Member

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

Серьёзно? PK может быть только один на таблице, ограничений UNIQUE множество. PK не допускает значений NULL, UNIQUE допускает (но только один раз :) )
1 сен 11, 17:32    [11214526]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
PK это полюбому unique, а unique не факт что PK =)
1 сен 11, 17:33    [11214530]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
recvezitor,

Ну и ? LAT LON однозначно определяют координатную точку (ПК кандидат geometry если на то уж пошло), высота ( глубина ) вашего метода измерения сильно зависит от волнения, осадки судна и так далее. Поэтому
1. Основная табла с координатами , с глубиной по медианному фильтру ( или иной допустимой функции) , координаты привязаны к узлам координатной сетки для последующего построения линий равных высот.
2. Таблица ( куча ) с измерениями.

3. На основании кучи считаем глубины по имеющимся значениям и добавляем / обновляем базовую таблицу

4.По базовой таблице може прореживать / апроксимировать значения почти в любой точке поверхности.

Чего упустил я?
1 сен 11, 17:34    [11214536]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
карась носогрыз
Guest
aleks2
А типерь внимание! ВОПРОС: чем UNIQUE отличается от PK?
По существу тока.


упали отжались бегом марш я так сказал

автор
Совершенно не понятно: зачем координаты хранить во float?


есть предположение что ТС как и я периодически не выговаривает некоторые буквы и цифры, и термин "с плавающей точкой" иногда использует для обозначения просто нецелого числа. от такой бяки хрен отучишься :-/
(слово float он вроде ни разу не упоминал)
1 сен 11, 17:35    [11214541]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
aleks2
BVB_berserk
Сделайте PK int-ом (суррогатный), а для координат хоть три отдельных столбца X Y Z, после чего на этих трёх столбцах создайте ограничение UNIQUE - и всё. Получите уникальность координат.


А типерь внимание! ВОПРОС: чем UNIQUE отличается от PK?
По существу тока.


Думаешь, они этого не читали ?
1 сен 11, 17:38    [11214563]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
карась носогрыз
(слово float он вроде ни разу не упоминал)


КСТАТИ ДА
1 сен 11, 17:46    [11214624]     Ответить | Цитировать Сообщить модератору
 Re: Корректно ли использовать числа с плавающей точкой в качестве первичного ключа?  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
автор
Совершенно не понятно: зачем координаты хранить во float?


есть предположение что ТС как и я периодически не выговаривает некоторые буквы и цифры, и термин "с плавающей точкой" иногда использует для обозначения просто нецелого числа. от такой бяки хрен отучишься :-/
(слово float он вроде ни разу не упоминал)[/quot]

:-)
Сильно извиняюсь, но в специализированных форумах желательно исходить из того, что используются общепринятые устоявшиеся термины. В частности, "число с плавающей запятой" никак не может быть приравнено к "числу с фиксированной запятой". Соответственно, для MS SQL тип данных "число с плавающей запятой" может быть только "float" или "real".
1 сен 11, 17:52    [11214671]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить