Есть БД, в которой идентификаторы (первичные ключи таблиц) имеют тип VARCHAR2(32) — один и тот же для всех таблиц. Эта БД создаётся с помощю немалого количества скриптов. Очень хотелось бы использовать во всех скриптах пользовательский тип, например:
CREATE TYPE Identifier AS OBJECT (identifier_string VARCHAR2(32));
Однако, Oracle запрещает создание первичных ключей по полям таблиц пользовательских типов.
Можно ли как-то выкрутиться из этой ситуации? Это желательно хотя бы потому, что со временем модель уникального идентификатора может измениться с VARCHAR2(32) на нечто другое, и тогда придётся перелопачивать кучу скриптов.
Заранее спасибо.
Re: [Oracle] Первичный ключ и пользовательский тип
Здравствуйте, aft, Вы писали:
aft>Однако, Oracle запрещает создание первичных ключей по полям таблиц пользовательских типов.
Ключи создаются по атрибутам типов:
create type Identifier as object(identifier_string varchar(32));
create table sometable (
id Identifier,
CONSTRAINT sometable_pk PRIMARY KEY (id.identifier_string)
);
aft>Это желательно хотя бы потому, что со временем модель уникального идентификатора может измениться с VARCHAR2(32) на нечто другое
Именно поэтому идентификаторы не привязывают к одному типу для всех таблиц.
aft>и тогда придётся перелопачивать кучу скриптов.
скрипты фигня, придется перелопачивать весь прикладной код, это намного хуже.
Идею об одинаковых идентификаторах лучше оставить.
Re[2]: [Oracle] Первичный ключ и пользовательский тип
Здравствуйте, wildwind, Вы писали:
W>Ключи создаются по атрибутам типов: W>
W>create type Identifier as object(identifier_string varchar(32));
W>create table sometable (
W> id Identifier,
W> CONSTRAINT sometable_pk PRIMARY KEY (id.identifier_string)
W>);
W>
Спасибо за вариант, хотя это не меняет дела.
W>Идею об одинаковых идентификаторах лучше оставить.
А что плохого? Для всех объектов, хранимых в БД, удобно держать один и тот же тип данных идентификатора. Есть единый механизм генерации идентификатора, уникального в пределах БД. Его придётся менять только в случае, если поменяется тип данных ключевого поля.
Re[3]: [Oracle] Первичный ключ и пользовательский тип
Здравствуйте, aft, Вы писали:
aft>Спасибо за вариант, хотя это не меняет дела.
Ты хотел, чтобы в CREATE TABLE не упоминалось varchar2(32)? Я показал как.
W>>Идею об одинаковых идентификаторах лучше оставить. aft>А что плохого? Для всех объектов, хранимых в БД, удобно держать один и тот же тип данных идентификатора. Есть единый механизм генерации идентификатора, уникального в пределах БД. Его придётся менять только в случае, если поменяется тип данных ключевого поля.
Вообще-то такая вещь, как тип данных ключевого поля, выбирается заранее, и так, чтобы потом не меняться. Если объекты в твоих таблицах имеют что-то общее, и тебе нужны идентификаторы для них, уникальные в пределах БД, то опиши их как объектные типы с иерерхией. Сделай все таблицы объектными, и получишь OID'ы.
Либо используй GUID'ы.