Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Беззнаковое число в PostgreSQL / 25 сообщений из 25, страница 1 из 1
28.03.2005, 18:55
    #32984809
Ape
Ape
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Можно ли использовать беззнаковые числа в PostgreSQL? Аналог unsigned int в MySQL.
...
Рейтинг: 0 / 0
28.03.2005, 19:16
    #32984847
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
можно , см. доках CREATE TABLE
CHECK (my_field>=0)

если ты хочешь преаращать signged в unsigned при insert'ах то скорее всего придется юзать тригера
...
Рейтинг: 0 / 0
28.03.2005, 19:29
    #32984868
Ape
Ape
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Не. Не так.
Задача простая:
Создаём таблицу, где первое поле ключевое и счётчик.
Если счётчик тип int , то имеем 2 147 483 647 возможных значений счётчика.
А если unsigned int , то в два раза больше.
Другими словами, 4 байта можно использовать более эффективно.
В MySQL есть операнд UNSIGNED, а в PostgreSQL как?
...
Рейтинг: 0 / 0
28.03.2005, 21:55
    #32985030
centur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Хмм... а что сериал уже исчерпался ?

с таким подходом что инт лучше - делаем текст поле, на текст триггер, который и поле увеличивает и кучу всего проверяет, если надо, тады и unsigned отдыхает... тут собственно бесконечность у нас в руках.. А еще тут есть уникальность в рамках базы (если не автоинкремент делать, а что похитрей...) =))

А если често не разу еще не видел чтобы сериал за 100 млн перевалил, может конечно мало видел.....
...
Рейтинг: 0 / 0
28.03.2005, 22:22
    #32985040
Ape
Ape
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
centurХмм... а что сериал уже исчерпался ?
...
А если често не разу еще не видел чтобы сериал за 100 млн перевалил, может конечно мало видел.....

А мне и не надо, чтобы счётчик доходил до сумасшедших чисел. Как раз наоборот. Если бы был оператор UNSIGNED для любого целочисленного типа, то остальное дело техники. Можно было бы сделать свою последовательность, эффективно используя всё пространство числового значения а не только положительную его часть. Например UNSIGNED SMALLINT дало бы счётчик на 65534 значения. И т.д.
...
Рейтинг: 0 / 0
29.03.2005, 00:07
    #32985127
DkmS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Ape Например UNSIGNED SMALLINT дало бы счётчик на 65534 значения. И т.д.
А вы что-то сэкономить хотите таким образом? Кроме места на диске, другого и не видно, что тут можео сэкономить. Оцените, во что выльется экономия двух байтов в 10 млн. записей.
...
Рейтинг: 0 / 0
29.03.2005, 10:21
    #32985502
Ape
Ape
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
DkmS Ape Например UNSIGNED SMALLINT дало бы счётчик на 65534 значения. И т.д.
А вы что-то сэкономить хотите таким образом? Кроме места на диске, другого и не видно, что тут можео сэкономить. Оцените, во что выльется экономия двух байтов в 10 млн. записей.

Да, это понятно, но желание всё оптимизировать присутствует всегда и не даёт спокойно спать.
...
Рейтинг: 0 / 0
29.03.2005, 11:22
    #32985704
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Ape Например UNSIGNED SMALLINT дало бы счётчик на 65534 значения. И т.д.
наверное это дело техники
например:
Код: plaintext
1.
2.
CREATE TABLE testsmall
(id int2  DEFAULT  (nextval('testsm_id_seq'::text) %  ( 65534 ) -  6534 / 2   ),
name text)

вот и вся ёптимизация
...
Рейтинг: 0 / 0
29.03.2005, 14:56
    #32986431
Ape
Ape
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
4321
наверное это дело техники
например:
Код: plaintext
1.
2.
CREATE TABLE testsmall
(id int2  DEFAULT  (nextval('testsm_id_seq'::text) %  ( 65534 ) -  6534 / 2   ),
name text)
вот и вся ёптимизация

Каким образом можно int2 присвоить значение 65534 , если сервер располагает все значения для данного типа в диапазоне от -32768 до +32767 , а беззнаковые величины не декларированы?
...
Рейтинг: 0 / 0
29.03.2005, 16:08
    #32986652
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Ape 4321
наверное это дело техники
например:
Код: plaintext
1.
2.
CREATE TABLE testsmall
(id int2  DEFAULT  (nextval('testsm_id_seq'::text) %  ( 65534 ) -  6534 / 2   ),
name text)
вот и вся ёптимизация

Каким образом можно int2 присвоить значение 65534 , если сервер располагает все значения для данного типа в диапазоне от -32768 до +32767 , а беззнаковые величины не декларированы?
вопрос неверный.
правильный вопрос (имеющий отношение к оптимизации)
можно ли засунуть в инт2 65534 значений счетчика. Ответ - можно. Как - показано выше. Если вам счетчики нужны не в какчестве ссылочных полей (для связей), а как нечто значимое (т.е. оптимизация у вас левым боком) - ничто не мешеате Вам интерпретировать id как id + 6534/2 на клиенте .

И не пытайтесь иметь людям мозги.
...
Рейтинг: 0 / 0
29.03.2005, 16:08
    #32986654
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
шиза...

ну вычитай из своего unsigned int 2 147 483 647 и получиш свой сигнед инт.. воткнеш его спокойно в базу и сиди радуйся оптимизации :))
...
Рейтинг: 0 / 0
29.03.2005, 18:01
    #32987026
Ape
Ape
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
авторвопрос неверный.
правильный вопрос (имеющий отношение к оптимизации)
можно ли засунуть в инт2 65534 значений счетчика. Ответ - можно. Как - показано выше. Если вам счетчики нужны не в какчестве ссылочных полей (для связей), а как нечто значимое (т.е. оптимизация у вас левым боком) - ничто не мешеате Вам интерпретировать id как id + 6534/2 на клиенте.

Нет, вопрос-то как раз верный. Несколькими постами выше я и ставил условие задачи, что счётчик является ключевым полем и естественно служит для связи. Оптимизировать-то мне нужно хранение данных на сервере, а не работу клиента с числовыми данными. Согласитесь, если есть возможность не хранить лишние байты в базе, то их не надо хранить. От этого и скорость выше и база меньше.
...
Рейтинг: 0 / 0
29.03.2005, 21:54
    #32987416
Sad Spirit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Ape
Несколькими постами выше я и ставил условие задачи, что счётчик является ключевым полем и естественно служит для связи.

Что мешает отрицательному числу быть ключевым полем и служить для связи?
...
Рейтинг: 0 / 0
29.03.2005, 23:04
    #32987474
DkmS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Sad SpiritЧто мешает отрицательному числу быть ключевым полем и служить для связи?
Привычка, скорее всего.
...
Рейтинг: 0 / 0
30.03.2005, 09:59
    #32987833
Ape
Ape
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Sad Spirit
Что мешает отрицательному числу быть ключевым полем и служить для связи?

DkmS
Привычка, скорее всего.

Привычка здесь не причём. Виной всему всё та же оптимизация и совмещение функций. Мешает этому то, что кроме того, это ключевое поле по совместительству является номером документа или клиента. Согласитесь, странный номер клиента -147 524 . Применять какой либо изврат на стороне клиента, типа подстановки дополнительных буковок в зависимости от знака, есть нарушение бизнес-логики. Для нумерации документов это вообще не подходит ни каким боком. Если создавать отдельное поле для номера, то какая это нахрен оптимизация?!
...
Рейтинг: 0 / 0
30.03.2005, 10:16
    #32987879
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
есть такой тип называется oid он 4х байтный беззнаковый.. если совесть позволит испоьзуй. :)
если нет

CREATE TYPE uint4
(INPUT=oidin, OUTPUT=oidout, DEFAULT='',
INTERNALLENGTH=4, ALIGNMENT=int4, STORAGE=PLAIN);

CREATE CAST (int4 AS uint4)
WITHOUT FUNCTION
AS IMPLICIT;

CREATE CAST (uint4 as int4)
WITHOUT FUNCTION
AS IMPLICIT;

и т.д...
...
Рейтинг: 0 / 0
30.03.2005, 10:25
    #32987913
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Ape
Применять какой либо изврат на стороне клиента, типа подстановки дополнительных буковок в зависимости от знака, есть нарушение бизнес-логики.

мдя. ("А почему, собственно" у Вас нарушается логика? Не сезонное ли это?)


Никто не утверждает, что наличие беззнаковых типов не упростило бы жизнь в таких вот "крайних случаях" (хм). Просто сказано, что отоптимизировать "в этом смысле" - дело техники. И вернуть вместо -1318 целое число (сдвигом, а совсем таки не "в зависимости от знака") - тоже дело техники. Причем не сложной. Нежелание этим заниматься - ваша проблема. Т.к. это Вам было необходимо что-то там оптимизировать. А совсем не мне.

"А ты азартен, Парамоша"
...
Рейтинг: 0 / 0
30.03.2005, 10:27
    #32987927
Sad Spirit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Ape
Привычка здесь не причём. Виной всему всё та же оптимизация и совмещение функций. Мешает этому то, что кроме того, это ключевое поле по совместительству является номером документа или клиента. Согласитесь, странный номер клиента -147 524 .
Использовать значение ключевого поля в кач-ве номера на клиенте --- неправильное решение, следующим вопросом очевидно будет "как избавиться от пропусков в нумерации". Единственная задача "суррогатного" первичного ключа --- идентифицировать запись, его значение никого особо интересовать не должно.

Вообще, вся тема напоминает настойчивый поиск более-менее искуственного недостатка с целью к нему прикопаться.
...
Рейтинг: 0 / 0
30.03.2005, 10:38
    #32987961
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Sad SpiritИспользовать значение ключевого поля в кач-ве номера на клиенте --- неправильное решение, следующим вопросом очевидно будет "как избавиться от пропусков в нумерации". Единственная задача "суррогатного" первичного ключа --- идентифицировать запись, его значение никого особо интересовать не должно.
Согласен. Как правило, такое разделение "значащих полей" полей и суррогатных ключей избавляет хтоя бы от необходимости каскадов (что очень далеко от "оптимальности") при "удалении пропусков" (и прочих изменениях "значения"

Sad Spirit
Вообще, вся тема напоминает настойчивый поиск более-менее искуственного недостатка с целью к нему прикопаться.
Не, ну wbear показал, как можно создавать свои типы. Это полезно. И снимает вопрос.
...
Рейтинг: 0 / 0
30.03.2005, 14:10
    #32988625
Ape
Ape
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Sad Spirit
Использовать значение ключевого поля в кач-ве номера на клиенте --- неправильное решение, следующим вопросом очевидно будет "как избавиться от пропусков в нумерации". Единственная задача "суррогатного" первичного ключа --- идентифицировать запись, его значение никого особо интересовать не должно.

Вообще, вся тема напоминает настойчивый поиск более-менее искуственного недостатка с целью к нему прикопаться.


Ну, зачем же так резко. Я спросил, Вы ответили. Не нравится вопрос, не отвечайте.

4321
мдя. ("А почему, собственно" у Вас нарушается логика? Не сезонное ли это?)


Спасибо за личностное определение... и за помощь в разборе вопроса.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
10.05.2007, 12:22
    #34515822
MySQLCraft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
А я согласен с автором топика. Мне тоже выёживаться с отрицательными идентификаторами влом.
Не понятно вообще почему отсутствует фундаментальный, с математической точки зрения, тип "положительное целое число" и введен как стандарт производный от него тип(понятие) "отрицательное целое число". Вот разработчики MySQL взяли на себя смелость не согласиться с этой очевидной глупостью и добавили беззнаковые типы, в отличие от разработчиков PostgreSQL,Interbase и Oracle.

Также совершенно непонятно отсутсвие int1 в этих трех уважаемых СУБД. Между тем этот тип нужен позарез. У меня в базе множество справочников с диапазоном 0..255 и множество таблиц которые на эти стравочники ссылаются. Я много раз спрашивал как реализовать то, как реализовать это и не получал вразумительного ответа ни разу. Вместо этого получал "умные советы" применять типы ,большей размерности, что чревато увеличением размера индекса в памяти и на диске и удвоением размера базы данных.
...
Рейтинг: 0 / 0
10.05.2007, 12:34
    #34515890
MySQLCraft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Кроме того автоинкремент(SERIAL) int2,int4,int8 никак не позволит использовать отрицательный диапазон(выдаст ошибку), поэтому не понятно как создать ключевое поле с полным диапазоном значений.

Кроме того даже если это удасться, то выборка с сортировкой по первичному ключу(который предполагает возрастание значений во времени) даст неправильный порядок записей. Для правильной сортировки придется вводить дополнительные поля.
...
Рейтинг: 0 / 0
10.05.2007, 12:55
    #34515975
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
MySQLCraftКроме того автоинкремент(SERIAL) int2,int4,int8 никак не позволит использовать отрицательный диапазон(выдаст ошибку), поэтому не понятно как создать ключевое поле с полным диапазоном значений.

Кроме того даже если это удасться, то выборка с сортировкой по первичному ключу(который предполагает возрастание значений во времени) даст неправильный порядок записей. Для правильной сортировки придется вводить дополнительные поля.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
postgres=# create sequence my_seq start - 20000  minvalue - 20000 ;
CREATE SEQUENCE
postgres=# select nextval('my_seq');
 nextval
---------
  - 20000 
( 1  запись)

postgres=# select nextval('my_seq');
 nextval
---------
  - 19999 
( 1  запись)
....
postgres=# insert into t1 values ( nextval('my_seq'), '1');
INSERT  0   1 
postgres=# insert into t1 values ( nextval('my_seq'), '2');
INSERT  0   1 
...
postgres=# alter sequence my_seq restart with  0 ;
ALTER SEQUENCE
postgres=# insert into t1 values ( nextval('my_seq'), '7');
INSERT  0   1 
postgres=# insert into t1 values ( nextval('my_seq'), '8');
INSERT  0   1 
...
postgres=# select * from t1 order by id;
   id   | val
--------+--------
 - 19970  |  1 
 - 19969  |  2 
 - 19968  |  3 
 - 19967  |  4 
 - 19966  |  5 
 - 19965  |  6 
       0  |  7 
       1  |  8 
       2  |  9 
       3  |  10 
( 10  rows)

postgres=# select * from t1 order by id desc;
   id   | val
--------+--------
       3  |  10 
       2  |  9 
       1  |  8 
       0  |  7 
 - 19965  |  6 
 - 19966  |  5 
 - 19967  |  4 
 - 19968  |  3 
 - 19969  |  2 
 - 19970  |  1 
( 10  rows)
...
Рейтинг: 0 / 0
10.05.2007, 17:44
    #34517198
MySQLCraft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Хм.. был жестоко обманут менеджером pgAdmin3, который не позволял устанавливать отрицательных начальных значений, а при попытке в инсерте переполнить int и уйти в отрицательный диапазон я получал ошибку...

Был неправ. Значит всё ОК! Просто нужно всё делать ручками.
Я возрадовался со всеми уважаемыми читателями.
...
Рейтинг: 0 / 0
11.05.2007, 09:02
    #34518006
ShadyAngel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Беззнаковое число в PostgreSQL
Согласен с топикстартером, unsigned поля были бы очень кстати. А к изобретателем велосипеда которые ездит задом вперед - у вас во многих таблицах сериальные ключи имеют отрицательные значения?

А нахерачить по десять строк то для обхода того-сего, эт конечно можно. Но, имхо, не нужно.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Беззнаковое число в PostgreSQL / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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