powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Уникальный идентификатор на уровне базы
22 сообщений из 22, страница 1 из 1
Уникальный идентификатор на уровне базы
    #32905472
Novice2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Postgres 8
Как можно реализовать уникальность на уровне базы.
oid - слишком мал (4 байта)
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32905531
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не подскажите ли для каких задач oid мал?
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32906011
tanat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создаешь базовую таблицу у которой делаешь ключ (например table_id) такого типа, какой нужен. Вешаешь на нее триггер для генерации ключа и все остальные таблицы наследуешь от базовой (причем в качестве триггера для ключа используешь функцию триггера базовой таблицы). Таким образом любая запись в любой таблице будет иметь уникальный ключ любой длины.
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32906194
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем ирмггер , если есть тип serial?
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32906308
tanat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
потому что он, как и oid, 4 байта :))
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32906365
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для чего нужно больше ?
подскажите ?
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32906418
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanatпотому что он, как и oid, 4 байта :))

Код: plaintext
1.
2.
3.
4.
Table  8 - 1 . Data Types
Name 	Aliases 	Description 

bigserial 	serial8 	autoincrementing eight-byte integer 

А таблица, кажется, нужна для получения запросами связанных через такой ключ детей через синтаксис ххх FROM parent* ххх ???
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32909067
centur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://gborg.postgresql.org/project/pguuid/projdisplay.php


а вообще поиск по "uuid postgres" выдает много результатов
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32914033
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возвращаясь к идее общей таблицы uid:

например :

Код: 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.
CREATE TABLE public.uid
(
  uid int8 NOT NULL,
  CONSTRAINT uid_pkey PRIMARY KEY (uid)
) WITHOUT OIDS;
--!
CREATE OR REPLACE FUNCTION public.set_default_uid()
  RETURNS trigger AS
'DECLARE
--всегда прописываем уникальный uid при любой вставке
--Before INSERT
BEGIN
	NEW.uid = nextval(\'public.uid_uid_seq\'::text);
	RETURN NEW;
END;'
  LANGUAGE 'plpgsql' VOLATILE;
--!
CREATE TRIGGER set_default_uid
  BEFORE INSERT
  ON public.uid
  FOR EACH ROW
  EXECUTE PROCEDURE public.set_default_uid();
--!
CREATE OR REPLACE FUNCTION public.save_default_uid()
  RETURNS trigger AS
'DECLARE
--всегда прописываем uid при любой вставке
--Before UPDATE
BEGIN
	NEW.uid = OLD.uid;
	RETURN NEW;
END;'
  LANGUAGE 'plpgsql' VOLATILE;
--!
CREATE TRIGGER save_default_uid
  BEFORE UPDATE
  ON public.uid
  FOR EACH ROW
  EXECUTE PROCEDURE public.save_default_uid();
--!
-- тестируем
CREATE TABLE public.test_uid
(
  uid int8 NOT NULL,
  name text,
  CONSTRAINT test_uid_pkey PRIMARY KEY (uid)
) INHERITS (public.uid) WITHOUT OIDS;

1. легко убеждаемся, что триггеры не наследуются сами, и в наследников я легко вставляю те же данные, что и в предка:

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT tableoid, * FROM uid;

tableoid	uid
 1935198 	 1 
 1935198 	 2 
 1935228 	 123 
 1935228 	 1 
- стало быть, как и предложено tanat-ом, копируем триггера в каждую табличку руками (нет ли модификатора, на наследование и триггеров?)

2. !!! внимание, вопросик: как в SQL получить по уникуму, поля таблицы-наследника, не описанные в предке?
только в plpgsql? через возврат tablename по tableoid из системной таблицы? и вставку его в собираемую SQL строку, запускаемую через EXECUTE?
Или есть таки метод получить поля прямо в SQL выражении?


___
PS: Кто вообще работал с такими штуками? Во что выливается обработка ссылки по uid (oid)? В смысле получения по ссылке типа (tableoid-а) а по типу данных - переключение интерфейса? Удобно ли это?

- Или этой фенечкой пользоваться менее удобно, чем непосредственным хранением 2-х полей - tid - идентификатор таблицы, в некоей таблице-регистре таблиц (где можно хранить и интерфейсные данные) + id записи в соответствующей таблице? - (по крайней мере в случае миграции/наследования бд код не завязан на старые tableoid)
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32916725
lionson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чем не устраивает sequence
он 8-байтный
т.е. макс значение 9223372036854775807
куда уж...
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32916917
Licvidator_guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну в общем, я бы сделал именно sequence.

А еще, если делать через то, через что у нас раньше казнили - то таблицу с одним полем CHAR(255), в который и писал бы эти самые уникальные значения. Надеюсь 255 байт достаточно для ваших целей?
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32928633
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Охренеть можно!!!
4 байта - это 2^32 = 4 294 967 296 строк!!!!!
Это кому не хватает 4 байт для oid???
Ж;-)))))))))))))))))))))))))))))))))
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32929145
kavenchuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если постоянно добавлять / удалять записи? Огород городить?
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32929772
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже если добавлять записи в таблицу непрерывно каждую секунду в течении года, этого хватит на 136 лет!!!

2^32 = 4 294 967 296 - oid
60 * 60 * 24 * 364 = 31 449 600 - количество секунд в году

4 294 967 296 / 31 449 600 = 136,6 (лет)

А теперь посчитаем сколько это в обьёме базы на одно поле одной таблицы.

4 294 967 296 - количество записей
4 байт - размер данных в поле oid

4 294 967 296 * 4 = 17 179 869 184 байт

17 179 869 184 / 1 000 000 000 = 17,2 Гигабайт

Обьём одного поля в базе 17,2 Гигабайт!!!!!!!

Это ж охренеть можно!


Это кто такие базы проектирует??? Ж;o)))))))))))
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32930871
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ApeДаже если добавлять записи в таблицу непрерывно каждую секунду в течении года, этого хватит на 136 лет!!!

Хм.
А если у Вас "запись" первички порождает записи в разные таблички, и каждая "подзапись" должна иметь уникальный внутри базы ID ? Если в "объекте 136.6 "полей", то порождая объект "первички" в секунду (и возможно убивая с примерно той же частотой) вы исчерпаетесь примерно за год. (согласно вашим же подсчетам).
При этом (если килинг имеет место) объем на момент краха будет не велик.

Но это "чиста теоретич. соображение". Я пока не имел дел с такой размерностью.
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32932156
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321А если у Вас "запись" первички порождает записи в разные таблички, и каждая "подзапись" должна иметь уникальный внутри базы ID ? Если в "объекте 136.6 "полей", то порождая объект "первички" в секунду (и возможно убивая с примерно той же частотой) вы исчерпаетесь примерно за год. (согласно вашим же подсчетам).
При этом (если килинг имеет место) объем на момент краха будет не велик.


Ну, во-первых, OID имеет циклическую функцию и по достижении максимального значения начинает считать сначала. Поэтому исчерпаться просто не может. Кстати поэтому же, как истинно уникальный идентификатор использовать его просто глупо. Дополнительно к этому, при проведении реиндексации базы OID записей тоже меняется. Что может дать такая уникальность?

Если у вас в базе 136 OID полей, а значит 136 таблиц, и запись в одной таблице вызывает кумулятивный эффект по OID-ам во всей базе, то не зная точно скорость появления и скорость уничтожения записей в базе, вы рискуете получить эти лишние 17 Гигабайт в базе гораздо раньше чем предполагаете.
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32932261
centur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о чем споры - для решения задачи есть uuid ... линк в теме выше ...
именно то что хочется... насколько я понял там уникальность чуть ли не абсолютная (там длинное поле типа связки мака, таймстампа и плясок с бубнами в чуме)
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32932709
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ape 4321А если у Вас "запись" первички порождает записи в разные таблички, и каждая "подзапись" должна иметь уникальный внутри базы ID ? Если в "объекте 136.6 "полей", то порождая объект "первички" в секунду (и возможно убивая с примерно той же частотой) вы исчерпаетесь примерно за год. (согласно вашим же подсчетам).
При этом (если килинг имеет место) объем на момент краха будет не велик.


Ну, во-первых, OID имеет циклическую функцию и по достижении максимального значения начинает считать сначала. Поэтому исчерпаться просто не может. Кстати поэтому же, как истинно уникальный идентификатор использовать его просто глупо. Дополнительно к этому, при проведении реиндексации базы OID записей тоже меняется. Что может дать такая уникальность?

Если у вас в базе 136 OID полей, а значит 136 таблиц, и запись в одной таблице вызывает кумулятивный эффект по OID-ам во всей базе, то не зная точно скорость появления и скорость уничтожения записей в базе, вы рискуете получить эти лишние 17 Гигабайт в базе гораздо раньше чем предполагаете.
При чем тут оид? Вопрос о int4 vs int8 и секвенсах на них. (А что оид еще и просто глупо - меня не интересует. Я его не предлагал). Использовать один счетчик на всю базу предложено выше. Чуть ниже приведена реализация. Вы влезли со своими оценками емкости 4битного поля. Я просто указал, что при интенсивной вставке "объектов" детально порезанных по полям (не обязательно в 136 таблиц - может случиться и "основная таблица полей" на 136 записей на "первичную запись + несколько записей в таблицы структуры) сиквенс инт4 исчерпается весьма быстро ("136 лет превращаются", "превращаются брюки в элегантные шорты" ) - т.е. сожрать пару порядков в секвенсе за счет схемы данных - не вопрос. При этом оиды никому на.к не упали. (... WITHOUT OIDS;) - см. више. И никакого проигрыша по объему, супротив ваших больших таблиц с большими дырками, такая "навороченная" схема может (на реальных данных) и не иметь.
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32933441
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assaВозвращаясь к идее общей таблицы uid:
...
PS: Кто вообще работал с такими штуками? Во что выливается обработка ссылки по uid (oid)? В смысле получения по ссылке типа (tableoid-а) а по типу данных - переключение интерфейса? Удобно ли это?


Изюм есть такой: работает DELETE FROM uid WHERE uid=xxx; - удаляется из любого потомка.

Проблема: Хочу FKey с каскадом именно на все uid. К сожалению FKey (и индексы, кааца) работает только с записями самой таблицы (т.е. как ONLY). Как обойти грабель?
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32937496
centur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2assa поищи функции check_foreign_key check_primary_key , не помню модуля, на работе у нас чел ответственный за СУБД собрал - это специальные сишные ф-ции , которые решают проблему форинов и примари с таблицами-наследниками.
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32937500
centur2assa поищи функции check_foreign_key check_primary_key , не помню модуля, на работе у нас чел ответственный за СУБД собрал - это специальные сишные ф-ции , которые решают проблему форинов и примари с таблицами-наследниками.

ВВаххх! Этта был ба иззюм!
...
Рейтинг: 0 / 0
Уникальный идентификатор на уровне базы
    #32947420
centur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
третий одинаковый пост в форуме, надеюсь модеры не обидятся - все по теме...
для Primary\foreign ключей на иерархичекие таблицы используй .../contrib/refint
как выяснилось с 8.0 идет в стандартной поставке контрибов


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


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