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

Откуда: Челябинск
Сообщений: 26
Уважаемые коллеги !

Помогите решить задачку заполнения таблицы ребер графа .

Граничные условия:
Есть таблица ребер графа
  CREATE TABLE T_ARCS (  
  ID           NUMBER(18,0) NOT NULL, 
  VERTEX1_ID   NUMBER(18,0) NOT NULL, 
  VERTEX2_ID   NUMBER(18,0) NOT NULL, 
   CONSTRAINT PK21_1 PRIMARY KEY (ID), 
   CONSTRAINT REFT_VERTICES31 FOREIGN KEY (VERTEX1_ID) REFERENCES T_VERTICES (ID), 
   CONSTRAINT REFT_VERTICES32 FOREIGN KEY (VERTEX2_ID) REFERENCES T_VERTICES (ID)
   ) 
Некий процесс кидает в данную таблицу связи, полученные в результате разбора графа (ребра между вершинами). Процесс устроен так, что дублирует каждое ребро, например:
ID   VERTEX1_ID VERTEX2_ID
 1         1                2
 2         2                1
 3         2                3
 4         3                2
Нужно заполнить таблицу, чтобы не было дубликатов, т.е. строки 1 и 2 идентичны, также как и 3 и 4.
Можно ли как-то создать такой constraint, чтобы он отсеивал дубликаты ? (или алгоритм ?)
Процесс менять нельзя, его исходники недоступны. Идет довольно большой поток данных (~1000 ребер в минуту) ...

С уважением, Alex.
29 апр 08, 09:48    [5606568]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Я правильно понимаю, что:
- Вы не можете никак поменять процесс, который пишет неправильно?
- Вы хотите подменять данные именно на лету, а не после загрузки?

Alex Rubtsov
Можно ли как-то создать такой constraint, чтобы он отсеивал дубликаты ?
Любой констрейнт(если бы его можно было написать) будет создавать исключения (при его нарушении) - этот "процесс" это съест?
29 апр 08, 09:59    [5606621]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
Elic
Member

Откуда:
Сообщений: 29979
Alex Rubtsov
Можно ли как-то создать такой constraint, чтобы он отсеивал дубликаты ? (или алгоритм ?)
Процесс менять нельзя, его исходники недоступны.
Сделать любым доступным способом так, чтобы процесс вставлял данные во view, в триггере на которое отсеивать строки по условию id1<=id2.
29 апр 08, 10:08    [5606662]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
Soft Wind
Member

Откуда:
Сообщений: 170
Elic
Alex Rubtsov
Можно ли как-то создать такой constraint, чтобы он отсеивал дубликаты ? (или алгоритм ?)
Процесс менять нельзя, его исходники недоступны.
Сделать любым доступным способом так, чтобы процесс вставлял данные во view, в триггере на которое отсеивать строки по условию id1<=id2.

Нифига - тогда вы будете отсеивать строки даже при первом вхождении...
Предлагаю уникальный индекс:

SQL> CREATE INDEX T_ARCS_VERTEX12_UI
  2    ON T_ARCS (
  3         LEAST(VERTEX1_ID, VERTEX2_ID)
  4        ,GREATEST(VERTEX1_ID, VERTEX2_ID)
  5       )
  6  ;

Индекс создан.

SQL> INSERT INTO T_ARCS VALUES(-1, 1,2);

1 строка создана.

SQL> INSERT INTO T_ARCS VALUES(-2, 2,1);
INSERT INTO T_ARCS VALUES(-2, 2,1)
*
ошибка в строке 1:
ORA-00001: нарушено ограничение уникальности (ASHINDAREV.T_ARCS_VERTEX12_UI)
29 апр 08, 10:16    [5606702]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
Elic
Member

Откуда:
Сообщений: 29979
Soft Wind
Нифига - тогда вы будете отсеивать строки даже при первом вхождении...
Alex Rubtsov
Процесс устроен так, что дублирует каждое ребро
29 апр 08, 10:19    [5606711]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
Тифа
Guest
а процес не загнется от ошибки?
может пусть себе льет а потом удалять или использовать вьюху для просмотра данных и дальнейшей обработки
29 апр 08, 10:20    [5606713]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
Alex Rubtsov
Member

Откуда: Челябинск
Сообщений: 26
Тифа

а процес не загнется от ошибки?

Нет, процесс скармливает данные в мою процедуру, там я ошибку поймаю.

Elic

Сделать любым доступным способом так, чтобы процесс вставлял данные во view, в триггере на которое отсеивать строки по условию id1<=id2

Не понял, можно слегка расшифровать ? Разрешать вставку только тогда, когда id1>id2 ?

Soft Wind

Предлагаю уникальный индекс: ....

Вариант ! Попробую ! Спасибо !

Спасибо всем ответившим !!!
Временно, отключаюсь, буду пробовать предложенные варианты !
29 апр 08, 10:35    [5606804]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
Soft Wind
Member

Откуда:
Сообщений: 170
Да, и ещё - данные у тебя уже не уникальны будут в плане набора плеч, посему - курсор
c id, которые кандидаты на удаление:

select id
  from ( select id
               ,vertex1_id
               ,vertex2_id
               ,count(1)     over (
                               partition by least(vertex1_id, vertex2_id), greatest(vertex1_id, vertex2_id)
                             ) as cnt
               ,row_number() over (
                               partition by least(vertex1_id, vertex2_id), greatest(vertex1_id, vertex2_id)
                               order by vertex1_id
                                       ,vertex2_id
                                       ,id
                             ) as rnum
           from t_arcs
       )
 where cnt  > 1
   and rnum > 1
;
29 апр 08, 10:42    [5606864]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
Soft Wind
Member

Откуда:
Сообщений: 170
Alex Rubtsov

Elic

Сделать любым доступным способом так, чтобы процесс вставлял данные во view, в триггере на которое отсеивать строки по условию id1<=id2

Не понял, можно слегка расшифровать ? Разрешать вставку только тогда, когда id1>id2 ?


Как я понимаю - предлагается унести таблицу, а вместо неё сделать VIEW с INSTEAD OF триггером. Соответственно - DML операции на INSERT/UPDATE триггер будет проверять на
уникальность.
Тока там есть ньюансы в случае, если запись ты не вставишь - надо знать реакцию софта,
который записи генерит.

В общем - удачи. О результатах свистни.
29 апр 08, 10:46    [5606896]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Alex Rubtsov
Тифа
а процес не загнется от ошибки?
Нет, процесс скармливает данные в мою процедуру, там я ошибку поймаю.
Это смотря как скармливает... :) И в какую именно процедуру :) И как дальше процесс себя ведет.
29 апр 08, 10:48    [5606909]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
а не плюнуть ли автору на всё слюной? Ить от того, что где-то хранится вдвое больше
данных чем надо - никто (сразу) еще не умирал. Сделайте вью
as select * from t where id1>id2 и читайте себе из неё..
29 апр 08, 12:34    [5607776]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
Тифа
Guest
Alex Rubtsov
Тифа

а процес не загнется от ошибки?

Нет, процесс скармливает данные в мою процедуру, там я ошибку поймаю.


эм а собсно нафига тогда констрейты если есть промежуточная процедура в которой можно отловить это
29 апр 08, 12:38    [5607811]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
еще вариант - вставку делать мержем, где, как (выше было) в одну колонку
всегда класть меньшее из пары, а в другую - большее.

ну и про инлекс - нафик он тут сдался? Если хотите строгостей - сделайте уж констрейнт id1<id2-и всё.
29 апр 08, 12:39    [5607821]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачку заполнения таблицы ребер графа .  [new]
Alex Rubtsov
Member

Откуда: Челябинск
Сообщений: 26
Merge - это конечно хорошо, но я им никогда не пользовался. А когда посмотрел описание синтаксиса - стало как-то непосебе :)

По поводу "Класть все" и "Разбирать внутри процедуры" - это никак. По первому возражение - _очень_ много данных, по второму - далее с этими таблицами будет работать еще один покупной софт (I2), который очень сильно ругается, если данные рассогласованы, т.е. если случайно залетит один arc, вставленный ручками, который зеркален к другому arc'у - хана.

Пока операция с _уникальным_ индексом прошла удачно, буду далее посмотреть, как туда будут литься данные.
29 апр 08, 13:01    [5607992]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить