В ненаправленном графе единственное, что вам нужно знать, это то, подключен ли узел к другому узлу.И нет такой вещи, как направление.
Простой подход:
class Node
has_many :connected_nodes
has_many :nodes, :through => :connected_nodes
end
class ConnectedNode
belongs_to :node
belongs_to :connected_node, :class_name => 'Node'
end
Это также называется списком смежности: для каждого узла мы можем легко получить список соседних (связанных) узлов.
ВозможенПроблема с этим подходом: мы храним соединения дважды.A подключен к B, а B подключен к A.
Так что, кажется, лучше нормализовать сохранение каждого подключения только один раз, и тогда мы действительно приблизимся к вашему первоначальному предложению.
class Connection
belongs_to :node1, :class_name => 'Node'
belongs_to :node2, :clasS_name => 'Node'
end
Только мы делаем все возможное, чтобы не навязывать какой-либо порядок или направление через именование.
Извлечение подключенных узлов - это все узлы, подключенные как node1
или как node2
, следовательно, фактически игнорируя любое возможное направление.
В этом случае вам также необходимо выразить подтверждение того, что соединение с (узел1, узел2) уникально, но что (узел2, узел1) на самом деле то же самое и не может быть вставлено дважды.
Мой личный выбор - использовать вторую схему, хотя поддержание первого решения может быть быстрее (см. Также вопрос ).
Я также нашел очень интересную статью , где автор объясняет, как графики могут храниться в базе данных.Очень глубокий, но в большей степени ориентированный на базу данных.
Надеюсь, это поможет.