[Oracle] Первичный ключ и пользовательский тип
От: aft  
Дата: 04.08.04 11:03
Оценка:
Есть БД, в которой идентификаторы (первичные ключи таблиц) имеют тип VARCHAR2(32) — один и тот же для всех таблиц. Эта БД создаётся с помощю немалого количества скриптов. Очень хотелось бы использовать во всех скриптах пользовательский тип, например:

CREATE TYPE Identifier AS OBJECT (identifier_string VARCHAR2(32));


И создавать таблицы примерно так:

CREATE TABLE sometable (
 id Identifier,
 CONSTRAINT sometable_pk PRIMARY KEY (id), --ошибка
-- ...
);


Однако, Oracle запрещает создание первичных ключей по полям таблиц пользовательских типов.
Можно ли как-то выкрутиться из этой ситуации? Это желательно хотя бы потому, что со временем модель уникального идентификатора может измениться с VARCHAR2(32) на нечто другое, и тогда придётся перелопачивать кучу скриптов.
Заранее спасибо.
Re: [Oracle] Первичный ключ и пользовательский тип
От: wildwind Россия  
Дата: 04.08.04 11:38
Оценка: 6 (2)
Здравствуйте, 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] Первичный ключ и пользовательский тип
От: aft  
Дата: 04.08.04 11:53
Оценка:
Здравствуйте, 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] Первичный ключ и пользовательский тип
От: wildwind Россия  
Дата: 04.08.04 12:11
Оценка:
Здравствуйте, aft, Вы писали:

aft>Спасибо за вариант, хотя это не меняет дела.

Ты хотел, чтобы в CREATE TABLE не упоминалось varchar2(32)? Я показал как.

W>>Идею об одинаковых идентификаторах лучше оставить.

aft>А что плохого? Для всех объектов, хранимых в БД, удобно держать один и тот же тип данных идентификатора. Есть единый механизм генерации идентификатора, уникального в пределах БД. Его придётся менять только в случае, если поменяется тип данных ключевого поля.

Вообще-то такая вещь, как тип данных ключевого поля, выбирается заранее, и так, чтобы потом не меняться. Если объекты в твоих таблицах имеют что-то общее, и тебе нужны идентификаторы для них, уникальные в пределах БД, то опиши их как объектные типы с иерерхией. Сделай все таблицы объектными, и получишь OID'ы.
Либо используй GUID'ы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.