LINUX.ORG.RU

Как обращаться с графами, хранящимися в реляционной БД?

 , ,


2

3

Привет ЛОР!

Поскольку моя текущая работа сильно завязана на embedded и iot, я решил, что в свободное время от всего этого надо бы отдыхать, и собираюсь запилить очередное OpenSource-поделие.

В данном поделии предполагается работа и визуализация графов.

В теории графов не силен, зато хорошо знаю область деятельности, для которой буду писать софтинку.

В БД так же не силен, собственно хочу изучить реляционные БД с в свободное время.

Соответственно есть вопросы к уважаемым регистрантам и анонимусам. Эти вопросы я хочу постить здесь.

Итак, первая часть вопросов

Мне нужно будет хранить направленные ациклические графы в виде узлов и связей. Я хочу делать это так, чтобы эти самые графы можно было легко копировать.

В БД, будут таблицы:

  • графы
    • id
    • desc
  • узлы
    • id
    • graph -> графы.id
    • desc
  • связи
    • id
    • src -> узлы.id
    • dst -> узлы.id

Насколько я понимаю, при копировании графа мне придется:

  • вставить новую запись в «графы»
  • запросить её id
  • вставить дубликаты узлов с новым id
  • запросить их id
  • преобразовать старые id узлов для связей в новые
  • вставить связи с новыми id узлов

Во всем это мне не нравятся два предпоследних шага. Хочется облегчить себе работу и есть две альтернативных идеи:

  • делать отдельные таблицы узлов из связей под каждый граф с ключами без автоинкремента, которые я буду генерировать сам и тупо копировать при копировании графа.

  • добавить в «связи» колонку graph -> графы.id, добавить в «узлы» колонку num (номер узла в графе) и соответственно из колонок src и dst «связей» ссылаться не на узлы.id, а на узлы.num.

На самом деле номера узлов у меня уже генерируются процедуркой, которая строит граф, так что с склоняюсь к последней идее.

Вопросы:

  • Насколько правильно я понимаю что, надо делать?
  • Как правильно обращаться с такими графами в реляционной БД?
  • Если перечисленные варианты жизнеспособны, то в каких случаях какой из них целесообразно использовать?
★★★★★

Последнее исправление: shkolnick-kun (всего исправлений: 2)
Ответ на: комментарий от no-such-file

Если вдруг это выльется во что-то многопользовательское, в чем я лично сомневаюсь, - будет rw-лок на весь граф сразу.

shkolnick-kun ★★★★★
() автор топика
Последнее исправление: shkolnick-kun (всего исправлений: 2)
Ответ на: комментарий от shkolnick-kun

Если вдруг это выльется во что-то многопользовательское

Если это чисто для себя, то тем более нет причин пытаться выжать воду из камня. Оставь автогенерируемый id в покое, и сделай unique индекс по graph_id, node_id. Однажды ты скажешь мне спасибо.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от no-such-file

Составные типы в качестве ключа это не самая популярная фича, рано или поздно ты попадёшь в ситуацию где тебе нужно использовать сторонний код или систему где такого нет, а ты уже накатал всё на составных ключах. И будет тебе жопа.

В задаче ТС нет никаких стронних систем, он всё сам контролирует. Налицо пример оверинжиниринга, когда боясь мифического стороннего кода принимают решения, мешающей эффективной реализации.

Кроме того , в случает варианта, предложенного PolarFox (с составными ключами) мы получаем контроль целостности данных на декларативном уровне , а именно - две вершины в ребре всегда будут принадлежать одному графу. Если же не делать составной ключ, то это будет затруднительно.

Да и тебе самому это будет неудобно. Простой пример - как найти последнюю добавленную строку? После добавления это ещё как-то можно, но и то везде по-разному, т.е. костыли. А если не сразу, в другой части системы? Ещё большие костыли. Даже тупо сохранить полученные данные в какой-нибудь хэш-массив по ключу не везде можно, нужно будет городить свой контейнер со своим хэшем и такие затыки на каждом шагу.

Да и тебе самому это будет неудобно. Простой пример - как найти последнюю добавленную строку? После добавления это ещё как-то можно, но и то везде по-разному, т.е. костыли. А если не сразу, в другой части системы? Ещё большие костыли. Даже тупо сохранить полученные данные в какой-нибудь хэш-массив по ключу не везде можно, нужно будет городить свой контейнер со своим хэшем и такие затыки на каждом шагу.

Борьба с неприятностями, которых нет. Еще один пример оверинжиниринга.

Итог с одной стороны имеет удобное копирование, декларативную целостность данных, отсутсвие ненужных уникальных индексов, с другой стороны боязнь непонятно чего и невнятные общие суждения, приводящие к неоптимальным решениям.

Psilocybe ★★★★★
()
Последнее исправление: Psilocybe (всего исправлений: 1)

Как обращаться с графами, хранящимися в реляционной БД?

Микроскоп не для забивания гвоздей, но ни кто не запрещает …

anonymous
()
Ответ на: комментарий от no-such-file

ЛОЛ, а ручная генерация graph_id, node_id конечно не затрудняет АГА. Да ТС на одном узле забибикается локи лепить чтобы разные люди одинаковые id не получили.

Зачем локи? достаточно использовать sequence

Psilocybe ★★★★★
()
Ответ на: комментарий от shkolnick-kun

, - будет rw-лок на весь граф сразу.

Не надо локов. Постарайся сделать добавление одним statement атомарность которого должна гарантировать любая СУБД.

Psilocybe ★★★★★
()
Ответ на: комментарий от shkolnick-kun

До 10 тыс «узлов» на локалхосте же!

Не заморачивайся тогда лучше с «промышленными» рбд типа mysql/pg, сделай всё в памяти и сбрасывай иногда в какой-нибудь sqlite или вообще сделай велик.
Если бы предметную область описал, я бы мог подробнее что-то сказать про структуру бд и на чём это лучше делать.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Уже заморочился

Предметная область - управление проектами.

В данном случае - работа с сетевой моделью проекта, генерация из модели AoN модели AoA, расчет критического пути и визуализация сетевой модели.

Примерный план:

  • Как доделаю модель данных - начну CRUD на dash для ввода данных и визуализации результатов расчетов.

  • Дальше буду натягивать сову на глобус сетевую модель на календарь.

  • Потом - на рабочие календари исполнителей.

  • Потом хочу запилить грейды исполнителей и оценку рисков срыва сроков.

На самом деле цель - начать осваивать этот ваш веб…

shkolnick-kun ★★★★★
() автор топика
Последнее исправление: shkolnick-kun (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.