导入的graph databases语言,理解在Rails中建模一个无向图?
- 节点(由圆圈表示),
- 边缘(由箭头表示),和
- 性质(元数据节点/边缘)
图形(维基百科提供)描述了一种directed graph。
在Rails中建模undirected graph的最佳方式是什么?
也就是说,一个图,其中所有边缘都倒数(如在上述图形),并且其中每个边缘的属性是相同的与方向无关(违背图形上文)。
让我们假设通过ActiveRecord使用SQL存储的默认Rails 3设置。
双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“过早优化...”) –
正确的工具和设计选择与过早优化不同。你知道如何很好地使用锤子,你可以用锤子来驱动螺丝钉,但这并不意味着它是最好的工具。此时切换到螺丝刀不是一个过早的优化。如果你打算认真对待这个项目,而不仅仅是一个玩具,那么像这样的考虑事先就是完全意义上的。如果这只是一个实验,看看关系数据库如何存储图表,那也没关系,但让我们将其添加到问题中,以便我们知道这是主要意图。 – ctcherry