Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Уникальный идентификатор на уровне базы / 22 сообщений из 22, страница 1 из 1
08.02.2005, 10:56
    #32905472
Novice2005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
Postgres 8
Как можно реализовать уникальность на уровне базы.
oid - слишком мал (4 байта)
...
Рейтинг: 0 / 0
08.02.2005, 11:11
    #32905531
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
не подскажите ли для каких задач oid мал?
...
Рейтинг: 0 / 0
08.02.2005, 13:29
    #32906011
tanat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
Создаешь базовую таблицу у которой делаешь ключ (например table_id) такого типа, какой нужен. Вешаешь на нее триггер для генерации ключа и все остальные таблицы наследуешь от базовой (причем в качестве триггера для ключа используешь функцию триггера базовой таблицы). Таким образом любая запись в любой таблице будет иметь уникальный ключ любой длины.
...
Рейтинг: 0 / 0
08.02.2005, 14:34
    #32906194
Niemi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
зачем ирмггер , если есть тип serial?
...
Рейтинг: 0 / 0
08.02.2005, 15:17
    #32906308
tanat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
потому что он, как и oid, 4 байта :))
...
Рейтинг: 0 / 0
08.02.2005, 15:34
    #32906365
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
Для чего нужно больше ?
подскажите ?
...
Рейтинг: 0 / 0
08.02.2005, 15:52
    #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
09.02.2005, 20:46
    #32909067
centur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
http://gborg.postgresql.org/project/pguuid/projdisplay.php


а вообще поиск по "uuid postgres" выдает много результатов
...
Рейтинг: 0 / 0
14.02.2005, 11:37
    #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
15.02.2005, 15:06
    #32916725
lionson
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
чем не устраивает sequence
он 8-байтный
т.е. макс значение 9223372036854775807
куда уж...
...
Рейтинг: 0 / 0
15.02.2005, 16:13
    #32916917
Licvidator_guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
Ну в общем, я бы сделал именно sequence.

А еще, если делать через то, через что у нас раньше казнили - то таблицу с одним полем CHAR(255), в который и писал бы эти самые уникальные значения. Надеюсь 255 байт достаточно для ваших целей?
...
Рейтинг: 0 / 0
22.02.2005, 15:07
    #32928633
Ape
Ape
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
Охренеть можно!!!
4 байта - это 2^32 = 4 294 967 296 строк!!!!!
Это кому не хватает 4 байт для oid???
Ж;-)))))))))))))))))))))))))))))))))
...
Рейтинг: 0 / 0
22.02.2005, 18:09
    #32929145
kavenchuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
А если постоянно добавлять / удалять записи? Огород городить?
...
Рейтинг: 0 / 0
23.02.2005, 13:49
    #32929772
Ape
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
24.02.2005, 12:08
    #32930871
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
ApeДаже если добавлять записи в таблицу непрерывно каждую секунду в течении года, этого хватит на 136 лет!!!

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

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


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

Если у вас в базе 136 OID полей, а значит 136 таблиц, и запись в одной таблице вызывает кумулятивный эффект по OID-ам во всей базе, то не зная точно скорость появления и скорость уничтожения записей в базе, вы рискуете получить эти лишние 17 Гигабайт в базе гораздо раньше чем предполагаете.
...
Рейтинг: 0 / 0
24.02.2005, 21:52
    #32932261
centur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
о чем споры - для решения задачи есть uuid ... линк в теме выше ...
именно то что хочется... насколько я понял там уникальность чуть ли не абсолютная (там длинное поле типа связки мака, таймстампа и плясок с бубнами в чуме)
...
Рейтинг: 0 / 0
25.02.2005, 10:29
    #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
25.02.2005, 13:39
    #32933441
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный идентификатор на уровне базы
assaВозвращаясь к идее общей таблицы uid:
...
PS: Кто вообще работал с такими штуками? Во что выливается обработка ссылки по uid (oid)? В смысле получения по ссылке типа (tableoid-а) а по типу данных - переключение интерфейса? Удобно ли это?


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

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

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


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


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