Привет ЛОР!
Поскольку моя текущая работа сильно завязана на 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.
На самом деле номера узлов у меня уже генерируются процедуркой, которая строит граф, так что с склоняюсь к последней идее.
Вопросы:
- Насколько правильно я понимаю что, надо делать?
- Как правильно обращаться с такими графами в реляционной БД?
- Если перечисленные варианты жизнеспособны, то в каких случаях какой из них целесообразно использовать?