Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Объекты в реляционной БД  [new]
pgmorcl
Member

Откуда:
Сообщений: 16
Разбираюсь с объектами в Oracle. Не могу никак понять, что такое OID и насколько он большой.
Пробую создать OID на базе первичного ключа - он вроде как должен быть меньше
по размеру. Создаю его на базе поля NUMBER(16) - который в базе займет 9 байт. Указываю,
что ссылка будет SCOPE - то есть привязка к конкретной таблице. По идее, размер ссылки должен еще уменьшить. Когда же я смотрю сколько ссылка занимает место в памяти, то получаю значение
в 76 байт!!! Ничего не пойму! Почему так много? Или чего я не понимаю! прошу объяснить

create or replace type TObj2;

create or replace type TObj1 as object
(
id number(16),
f1 number(10),
f2 varchar2(20),
f3 ref TObj2
);

create or replace type TObj2 as object
(
id number(16),
f1 number(10, 2),
f2 varchar2(20)
);

create table obj2_t of TObj2
(
id primary key
)
object identifier is primary key;

create table obj1_t of TObj1
(
id primary key,
scope for (f3) is obj2_t
)
object identifier is primary key;

insert into obj1_t values (1, 10, 'Text_10', null)
insert into obj2_t values (1, 10.34, 'Text_10.34')

update obj1_t
set
f3 = (select ref(p) from obj2_t p where id = 1)
where
id = 1

select vsize(f3) from obj1_t

select * from user_tab_columns
19 дек 07, 15:13    [5069085]     Ответить | Цитировать Сообщить модератору
 Re: Объекты в реляционной БД  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
pgmorcl
Когда же я смотрю сколько ссылка занимает место в памяти, то получаю значение
в 76 байт!!!


Покажи :)
19 дек 07, 15:55    [5069524]     Ответить | Цитировать Сообщить модератору
 Re: Объекты в реляционной БД  [new]
pgmorcl
Member

Откуда:
Сообщений: 16
Чnо показать?
19 дек 07, 16:04    [5069613]     Ответить | Цитировать Сообщить модератору
 Re: Объекты в реляционной БД  [new]
pgmorcl
Member

Откуда:
Сообщений: 16
Вот сделайте выборку

select * from obj1_t

и посмотрите размер поля f3
19 дек 07, 16:06    [5069624]     Ответить | Цитировать Сообщить модератору
 Re: Объекты в реляционной БД  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
pgmorcl

и посмотрите размер поля f3


тынц

автор

(However, a REF to a PK-based OID, which must be dynamically constructed on being selected, may take more space in memory than a REF to a system-generated OID.)
19 дек 07, 16:11    [5069699]     Ответить | Цитировать Сообщить модератору
 Re: Объекты в реляционной БД  [new]
pgmorcl
Member

Откуда:
Сообщений: 16
Если я сделаю так


create table obj2_t of TObj2 

drop table obj1_t
create table obj1_t of TObj1 
(
  scope for (f3) is obj2_t
)

insert into obj1_t values (1, 10, 'Text_10', null)
insert into obj2_t values (1, 10.34, 'Text_10.34')

update obj1_t
set 
  f3 = (select ref(p) from obj2_t p where id = 1)
where
  id = 1  

select vsize(f3) from obj1_t

36

select vsize(ref(p)) from obj2_t p

42


А как объяснить результаты 36 и 42?
19 дек 07, 16:45    [5070037]     Ответить | Цитировать Сообщить модератору
 Re: Объекты в реляционной БД  [new]
pgmorcl
Member

Откуда:
Сообщений: 16
In general, you should use scoped REFs instead of unscoped REFs because scoped REFs are stored more efficiently. Whereas an unscoped REF takes at least 36 bytes to store (more if it uses rowids), a scoped REF is stored as just the OID of its target object and can take less than 16 bytes, depending on whether the referenced OID is system-generated or primary-key based

И как это понимать? Ведь я указал SCOPE!
19 дек 07, 16:48    [5070067]     Ответить | Цитировать Сообщить модератору
 Re: Объекты в реляционной БД  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
pgmorcl

А как объяснить результаты 36 и 42?


Ну, 42 довольно просто - 16 + 16 + 10 = 42.


A REF contains the following three logical components:

OID of the object referenced. A system-generated OID is 16 bytes long. The size of a primary-key based OID depends on the size of the primary key column(s).
OID of the table or view containing the object referenced, which is 16 bytes long.
Rowid hint, which is 10 bytes long.
19 дек 07, 17:35    [5070523]     Ответить | Цитировать Сообщить модератору
 Re: Объекты в реляционной БД  [new]
pgmorcl
Member

Откуда:
Сообщений: 16
автор
Ну, 42 довольно просто - 16 + 16 + 10 = 42.


1. Опция SCOPE по идее должна сократить размер на 16 байт
2. ROWID хранится, если явно указать WITH ROWID

Должно храниться только 16 байт. Возможно при извлечении они автоматом дописываются, но
как это проверить не представляю???

Еще не совсем понятна работа ограничений на ссылках

Например:

Есть две объектных таблицы DOC, BODY.

TBody
(
  ...
)

TDoc
(
  ref_body ref TBody
)

create table doc of TDoc
create table body of TBody

alter table doc add constraint doc$fk$ref_body foreign key (ref_body) references body

Допустим я внес по одной записи в каждую таблицу... одна ссылается на другую
Теперь пытаюсь удалить запись из BODY

delete body

ошибка ограничения целостности. Это вроде как логично

Теперь пытаюсь удалить DOC

delete doc

Удалилась влегкую. А запись в BODY осталась. Я изначально при проектировании предполагал, что
документ имеет ссылочно поле на BODY. Но при таком подходе ограничение работает не так как
надо. Если бы я ссылку на документ поместил в BODY (то есть тело ссылается на родительский
документ), то тогда я не мог бы удалить DOC пока не удалю его BODY. Однако, когда я осуществляю поиск, я ищу именно джокументы, и, найдя их, обращаюсь к телу документа, то есть ссылка все-таки должна сидеть в DOC и ссылаться надо на BODY, но тогда не работает ограничение так как нужно... Чтоделать?
21 дек 07, 15:34    [5081546]     Ответить | Цитировать Сообщить модератору
 Re: Объекты в реляционной БД  [new]
TiG
Member

Откуда:
Сообщений: 780
pgmorcl
Я изначально при проектировании предполагал, что
документ имеет ссылочно поле на BODY. Но при таком подходе ограничение работает не так как
надо. Если бы я ссылку на документ поместил в BODY (то есть тело ссылается на родительский
документ), то тогда я не мог бы удалить DOC пока не удалю его BODY. Однако, когда я осуществляю поиск, я ищу именно джокументы, и, найдя их, обращаюсь к телу документа, то есть ссылка все-таки должна сидеть в DOC и ссылаться надо на BODY, но тогда не работает ограничение так как нужно... Чтоделать?
ну так и делайте внешний ключ body->doc плюс индекс по нему, и удаляйте на здоровье, а не выдумывайте обратных ссылок
а еще лучше используйте обычные таблицы, а объектные выкиньте нафик - от них больше проблем
или вон с Кайта пример берите - данные в обычных таблицах, а объектность прикручивайте сверху в виде объектных вьюх, если очень хочется
21 дек 07, 16:23    [5081892]     Ответить | Цитировать Сообщить модератору
 Re: Объекты в реляционной БД  [new]
pgmorcl
Member

Откуда:
Сообщений: 16
Нужна именно объектная модель... в моем случае это идеальный вариант решения
В книге Кайта посмотрел - там игрушечный пример, далекий от реальности и
не дающий от объектов никаких приемуществ и ссылки должны идти именно в том порядке,
в котором требуется... ну да ладно... буду думать
26 дек 07, 10:01    [5097081]     Ответить | Цитировать Сообщить модератору
 Re: Объекты в реляционной БД  [new]
TiG
Member

Откуда:
Сообщений: 780
pgmorcl
Нужна именно объектная модель... в моем случае это идеальный вариант решения
В книге Кайта посмотрел - там игрушечный пример, далекий от реальности и
не дающий от объектов никаких приемуществ и ссылки должны идти именно в том порядке,
в котором требуется... ну да ладно... буду думать

Вы пытаетесь напрямую спроецировать принцип реализации отношений между классами в языках типа джавы или c++ на объектно-реляционную модель в оракле. Если у вас в модели сущность "документ" содержит сущность "тело документа" и скажем в джаве это выглядело бы как атрибут типа "тело документа" в классе "документ", то в реляционной (по сути, и от этого никуда не денешься) модели хранения оракла правильный аналог связи типа "включает" - внешний ключ в таблице "тело документа" ссылающийся на таблицу "документ". Именно поэтому у вас каскадные удаления работают "в обратную сторону".
А вы вообще уверены что вам нужна полноценная объектная модель в оракле ? Объектные возможности в Оракле это всего лишь не очень развитая и не очень удобная надстройка над очень развитой и очень хорошей реляционной БД. Вы думаете почему так мало кто эти фичи применяет полноценно по прямому назначению ?
Используйте одну из существующих ORM-библиотек (или самописную если с этим плохо) для вашего инструмента разработки и поймете, что можно прекрасно обойтись без объектных таблиц, да еще и избавиться от кучи особенностей и ограничений.
26 дек 07, 11:01    [5097411]     Ответить | Цитировать Сообщить модератору
 Re: Объекты в реляционной БД  [new]
Охрименко
Member

Откуда: Украина, Киев
Сообщений: 1440
У нас крутая запутаная схема с объектами, ссылками, перегруженными функциями и прочими наворотами. В час пик была загрузка по процам 100%, при том что пользователей не так много по меркам оракла, около 300. Так что организация логики и вычислений на стороне сервера это конечно хорошо, но не всегда. Кроме того сам прочувствовал что иногда данные действительно нуждаются в дублировании или предварительном сохраненном расчете значений. Иначе будет как у нас перегруженность системы даже на кластере с 2мя 4процессорными нодами и 8Гб памяти на каждой ноде. Память не спасает от перегрузки процессоров. А для того чтобы вам потом переписать попроще ваш код потребуется время и не факт что это вообще будет возможно. Решение за вами...
26 дек 07, 11:40    [5097718]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить