Сохранить график в базе данных довольно просто: у вас есть таблица для узлов и таблица для ребер, которая действует как таблица отношений «многие ко многим» между таблицей узлов и самой собой.Вот так:
create table node (
id integer primary key
);
create table edge (
start_id integer references node,
end_id integer references node,
primary key (start_id, end_id)
);
Однако есть несколько неприятных моментов, связанных с хранением графа таким образом.
Во-первых, ребра в этой схеме естественно направлены - начало и конецразличны.Если ваши ребра не направлены, то вам нужно будет либо соблюдать осторожность при написании запросов, либо хранить две записи в таблице для каждого ребра, по одному в любом направлении (а затем быть осторожным при написании запросов!).Если вы сохраняете одно ребро, я бы предложил нормализовать сохраненную форму - возможно, всегда рассматривайте узел с самым низким ID как начало (и добавьте проверочное ограничение в таблицу для обеспечения этого).Вы могли бы иметь действительно неупорядоченное представление, не имея ребер, ссылающихся на узлы, а скорее имея таблицу соединения между ними, но это не кажется мне хорошей идеей.
Во-вторых, схема вышене имеет возможности представлять мультиграф.Вы можете расширить его достаточно легко, чтобы сделать это;если ребра между данной парой узлов неразличимы, проще всего было бы добавить счетчик к каждому ряду ребер, говоря, сколько ребер существует между указанными узлами.Если они различимы, то вам нужно будет что-то добавить в таблицу узлов, чтобы их можно было различить - автоматически сгенерированный идентификатор ребра может быть самым простым.проблема работы с графиком.Если вы хотите выполнить всю вашу обработку объектов в памяти, а база данных предназначена исключительно для хранения, тогда проблем нет.Но если вы хотите выполнять запросы к графу в базе данных, вам придется выяснить, как выполнять их в SQL, который не имеет встроенной поддержки графов и основные операции которого не так легко адаптировать кработать с графиками.Это можно сделать, особенно если у вас есть база данных с рекурсивной поддержкой SQL (PostgreSQL, Firebird, некоторые проприетарные базы данных), но для этого нужно подумать.Если вы хотите сделать это, я предлагаю опубликовать дополнительные вопросы о конкретных запросах.