|
|
|
Поиск связей между таблицами
|
|||
|---|---|---|---|
|
#18+
Всем привет! Появилась неординарная (а может и вполне обычная :)) задача из области BI. Клинент, по всей видимости, не знает как устрена его база и ему лень разбираться. Но он хочет знать, как логически можно связать несколько таблиц, используя имеющиеся внешние ключи, чтобы потом искать законмерности и т.д. Суть задачи: клиент задает таблицу A и таблицу B. Функция на базе должна найти путь по FK между ними, если он существует конечно. По FK можно пройти как от родителя к потомку, так и от потомка к родителю. Например, если A->C и B->C, значит путь между таблицами A и B = A->C->B (ну надо еще конкретные столбцы указать конечно). Похоже задача сводится к поиску пути в неориентированном невзвешенном графе, который еще и несвязный к тому же. В принципе, обойти граф - это не проблема. Проблема - реализовать это в базе. Не понятно, как представить постгресовскую базу в виде графа (Postgresql 9.2.6) и как на plpsql запрограммировать его обход и выдачу результата. Если есть какие-нибудь идеи или опыт в таких задачах, поделитесь пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2015, 14:23 |
|
||
|
Поиск связей между таблицами
|
|||
|---|---|---|---|
|
#18+
andzhi4 Проблема - реализовать это в базе. Не понятно, как представить постгресовскую базу в виде графа (Postgresql 9.2.6) и как на plpsql запрограммировать его обход и выдачу результата. Если есть какие-нибудь идеи или опыт в таких задачах, поделитесь пожалуйста. Ничего не надо реализовывать, все исходные данные уже есть. Нужно смотреть "information schema.table_constraints" НУ и "покурить" над рекурсивным запросом. <:o) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2015, 14:32 |
|
||
|
Поиск связей между таблицами
|
|||
|---|---|---|---|
|
#18+
Но в результате рекурсивного запроса я получу например: A -B -C --D E -F -G -D Отсюда легко найти связь между скажем А и С, но неочевидно, что А и E тоже связаны, только через D, которая для них общий потомок. Все равно напрашивается хитрый алгоритм обхода всей этой пыжни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2015, 15:01 |
|
||
|
Поиск связей между таблицами
|
|||
|---|---|---|---|
|
#18+
andzhi4Но в результате рекурсивного запроса я получу например: A -B -C --D E -F -G -D Отсюда легко найти связь между скажем А и С, но неочевидно, что А и E тоже связаны, только через D, которая для них общий потомок. Все равно напрашивается хитрый алгоритм обхода всей этой пыжни. А почитайте про запросы по дереву. У вас будет A, B A, C B, C Где-то так. :-) Можно даже путь получить. A, B, [A,B] A, C, [A,B,C] B,C, [B,C] Сам такие запросы писал, только давно. Сейчас без гугла не вспомню :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2015, 15:13 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38911203&tid=1998103]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
170ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 496ms |

| 0 / 0 |
