【发布时间】:2011-12-20 01:12:23
【问题描述】:
导入graph databases的语言,懂
- 节点(用圆圈表示),
- 边(用箭头表示),以及
- 属性(节点/边的元数据)
图片(由维基百科提供)描述了directed graph。
在 Rails 中建模 undirected graph 的最佳方法是什么?
也就是说,所有边都是互易的图(如上图),并且每条边的属性无论方向如何都相同(与上图相反)。
让我们假设默认的 Rails 3 设置通过 ActiveRecord 使用 sql 存储。
double polymorphic association 将创建一个有向图,能够对上图描述的数据进行建模。
def Edge < ActiveRecord::Base
belongs_to :head, polymorphic: true
belongs_to :tail, polymorphic: true
end
class Node < ActiveRecord::Base
has_many :from, as: :head
has_many :to, as: :tail
end
class Group < ActiveRecord::Base
# a Node of Type: Group
has_many :from, as: :head
has_many :to, as: :tail
end
应该扩展此模型以管理反向关系,还是有更好的模型可用?
应用程序的一个元素可能是图问题,但这并不意味着应用程序以问题为中心,必须对数据执行图横断,也不意味着数据集大于可用内存。
【问题讨论】:
-
如果您需要大图的高性能,您需要根据您的假设工作。这不适合 (sql) RDBMS。
-
不适合大图?绝对地。但仍有可能。一旦有了将要处理的真实数据的示例,在初始原型之后交换或修改存储层比我书中最初增加的复杂性更可取。 (调用 Knuth “过早优化...”)
-
正确的工具和设计选择与过早优化不同。你知道如何很好地使用锤子,你可以用锤子敲螺丝,但这并不意味着它是完成这项工作的最佳工具。此时切换到螺丝刀并不是过早的优化。如果您打算认真对待这个项目,并且它不仅仅是一个玩具,那么这样的考虑是完全有意义的。如果这只是一个实验,看看关系数据库如何存储图表,那也没关系,但让我们将其添加到问题中,以便我们知道这是主要意图。
标签: ruby-on-rails activerecord graph polymorphism prototyping