Типы идентификаторов объектов

Идентификаторы объектов (OID) используются внутри QHB в качестве первичных ключей для различных системных таблиц. Идентификатор объекта представляется типом oid. Также для oid определены следующие типы- псевдонимы: regproc, regprocedure, regoper, regoperator, regclass, regtype, regrole, regnamespace, regconfig и regdictionary. Обзор этих псевдонимов представлен в таблице 26.

В настоящее время тип oid реализован как четырехбайтное целое беззнаковое число. Следовательно, он недостаточно велик, чтобы полностью обеспечить уникальность в больших базах данных или даже в отдельных больших таблицах.

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

У типов-псевдонимов OID нет собственных операций, кроме специализированных функций ввода и вывода. Эти функции могут принимать и отображать не исходное числовое значение, как тип oid, а символические имена системных объектов. Типы-псевдонимы позволяют упростить поиск объектов по значениям OID. Например, чтобы выбрать из pg_attribute строки, относящиеся к таблице mytable, можно написать:

SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass;

вместо:

SELECT * FROM pg_attribute
  WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'mytable');

Хотя второй запрос сам по себе не так уж плох, он все равно чересчур упрощен. Если в разных схемах есть несколько таблиц с именем mytable, то для выбора правильного OID потребуется гораздо более сложный субзапрос. Преобразователь вводимого значения типа regclass находит таблицу в соответствии с настройкой пути к схеме, поэтому автоматически выполняет «правильные действия». Точно так же приведение OID таблицы к типу regclass удобно для символического отображения числового OID.

Таблица 26. Типы идентификаторов объектов

ИмяСсылкиОписаниеПример значения
oidЛюбыечисловой идентификатор объекта564182
regprocpg_procимя функцииsum
regprocedurepg_procфункция с типами аргументовsum(int4)
regoperpg_operatorимя оператора+
regoperatorpg_operatorоператор с типами аргументов*(integer,integer) или -(NONE,integer)
regclasspg_classимя отношенияpg_type
regtypepg_typeимя типа данныхinteger
regrolepg_authidимя ролиsmithee
regnamespacepg_namespaceимя пространства именpg_catalog
regconfigpg_ts_configконфигурация текстового поискаenglish
regdictionarypg_ts_dictсловарь текстового поискаsimple

Все типы-псевдонимы OID для объектов, сгруппированных в пространстве имен, принимают имена, дополненные именем схемы, и будут выводить имена со схемой, если этот объект нельзя найти в текущем пути поиска без имени схемы. Типы- псевдонимы regproc и regoper принимают только уникальные вводимые имена (не перегруженные), поэтому их использование ограничено; в большинстве случаев больше подходят regprocedure или regoperator. Для regoperator при определении унарных операторов вместо неиспользуемого операнда записывается слово NONE.

Дополнительным свойством большинства типов-псевдонимов OID является создание зависимостей. Если в сохраненном выражении (например, в выражении столбца по умолчанию или в представлении) появляется константа одного из этих типов, она создает зависимость от ссылочного объекта. Например, если у столбца выражение по умолчанию nextval(’my_seq’::regclass), QHB понимает, что это выражение зависит от последовательности my_seq; система не позволит удалить последовательность, не удалив предварительно выражение по умолчанию. Тип regrole является единственным исключением для этого свойства. Константы этого типа в таких выражениях не допускаются.

Примечание
Типы-псевдонимы OID не вполне соответствуют правилам изоляции транзакций. Планировщик также воспринимает их как простые константы, что может привести к неоптимальному планированию.

Другим типом идентификатора, используемым системой, является xid, или идентификатор транзакции (сокращенно xact). Это тип данных системных столбцов xmin и xmax. Идентификаторы транзакции являются 32-битными величинами.

Третий тип идентификатора, используемый системой, — cid, или идентификатор команды. Это тип данных системных столбцов cmin и cmax. Идентификаторы команд также являются 32-битными величинами.

Последний тип идентификатора, используемый системой, — это tid, или идентификатор кортежа (идентификатор строки). Это тип данных системного столбца ctid. ID кортежа — это пара (номер блока, индекс кортежа в блоке), которая определяет физическое расположение строки в таблице.

(Более подробно системные столбцы рассматриваются в разделе Системные столбцы).