導入的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