Имеет ли смысл отображать структуру данных графика в реляционную базу данных? - PullRequest
6 голосов
/ 30 декабря 2010

В частности, Мультиграф .

Какой-то коллега предложил это, и я совершенно сбит с толку.

Есть идеи по этому поводу?

Ответы [ 4 ]

7 голосов
/ 31 декабря 2010

Сохранить график в базе данных довольно просто: у вас есть таблица для узлов и таблица для ребер, которая действует как таблица отношений «многие ко многим» между таблицей узлов и самой собой.Вот так:

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, некоторые проприетарные базы данных), но для этого нужно подумать.Если вы хотите сделать это, я предлагаю опубликовать дополнительные вопросы о конкретных запросах.

2 голосов
/ 31 декабря 2010

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

Не учитывая, какие типы запросов вы можете выполнять, начните с двух таблиц vertices и edges. Вершины простые, идентификатор и имя. Края сложны, учитывая мультиграф. Края должны быть однозначно идентифицированы комбинацией двух вершин (то есть внешних ключей) и некоторой дополнительной информации. Дополнительная информация зависит от решаемой проблемы. Например, если информация о рейсе, время вылета и прилета и авиакомпания. Кроме того, вам нужно решить, направлен ли край (то есть в одну сторону) или нет, и отслеживать эту информацию.

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

Программирование Коллективного Разума есть несколько полезных алгоритмов для этой цели. Но то, где хранятся данные, не меняет сам алгоритм.

1 голос
/ 30 декабря 2010

Ну, информация должна храниться где-то, реляционная база данных - неплохая идея.

Это было бы просто отношение «многие ко многим», таблица списка узлов и таблица списка ребер / соединений.

0 голосов
/ 30 декабря 2010

Подумайте, как Facebook может реализовать социальный граф в своей базе данных. У них может быть стол для людей и другой стол для дружбы. Таблица дружбы содержит как минимум два столбца, каждый из которых является внешним ключом таблицы людей.

Поскольку дружба симметрична (в Facebook), они могут убедиться, что идентификатор первого внешнего ключа всегда меньше идентификатора второго внешнего ключа. У Twitter есть ориентированный граф для его социальной сети, поэтому он не будет использовать такое каноническое представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...