graph databases की भाषा आयात,रेल में एक अप्रत्यक्ष ग्राफ मॉडल?
- नोड्स को समझने (हलकों द्वारा प्रतिनिधित्व),
- किनारों (तीर द्वारा प्रतिनिधित्व), और
- गुण (मेटाडाटा नोड्स/किनारों के)
ग्राफिक (विकिपीडिया के सौजन्य से) एक directed graph वर्णन करता है।
रेल में undirected graph मॉडल करने का सबसे अच्छा तरीका क्या है?
कहना है कि, एक ग्राफ जहां सभी किनारों पारस्परिक (ऊपर ग्राफिक के रूप में) हैं, और जहां प्रत्येक बढ़त के गुणों दिशा की परवाह किए बिना ही कर रहे हैं (विपरीत ऊपर ग्राफिक के लिए)।
आइए ActiveRecord के माध्यम से एक एसक्यूएल स्टोर का उपयोग कर एक डिफ़ॉल्ट रेल 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
क्या कोई इस मॉडल को व्यस्त रिश्तों को प्रबंधित करने के लिए बढ़ा सकता है, या एक बेहतर मॉडल उपलब्ध है? एक एप्लिकेशन के
एक तत्व एक ग्राफ समस्या हो सकती है, लेकिन इसका मतलब यह नहीं एप्लिकेशन समस्या के आसपास केंद्रित है, कि ग्राफ transversals डेटा पर किया जाना चाहिए, और न ही डाटासेट उपलब्ध स्मृति से बड़ा है कि । आप स्टोर कर सकते हैं बढ़त के गुणों सदस्यता मॉडल int के माध्यम से
class Group < ActiveRecord::Base
has_many :memberships
has_many :persons, :through => :memberships
end
class Membership < ActiveRecord::Base
belongs_to :group
belongs_to :person
end
class Person < ActiveRecord::Base
has_many :memberships
has_many :groups, :through => :memberships
end
:
यदि आपको बड़े ग्राफ के साथ उच्च प्रदर्शन की आवश्यकता है, तो आपको अपनी धारणाओं पर काम करने की आवश्यकता है। यह एक (एसक्यूएल) आरडीबीएमएस के लिए एक बुरा फिट है। –
बड़े ग्राफ के लिए एक बुरा फिट? पूर्ण रूप से। लेकिन फिर भी संभव है। एक प्रारंभिक प्रोटोटाइप के बाद स्टोरेज परत को स्वैपिंग या संशोधित करने के बाद एक बार वास्तविक डेटा का एक उदाहरण होता है, जिसमें से मेरी वेबसाइट में प्रारंभिक अतिरिक्त जटिलता के लिए बेहतर होगा। (Knuth "समयपूर्व अनुकूलन ...") –
सही उपकरण और डिजाइन विकल्प समयपूर्व अनुकूलन के समान नहीं हैं। आप जानते हैं कि एक हथौड़ा वास्तव में अच्छी तरह से कैसे उपयोग करें, और आप एक हथौड़ा के साथ एक पेंच ड्राइव कर सकते हैं, लेकिन इसका मतलब यह नहीं है कि यह नौकरी के लिए सबसे अच्छा उपकरण है। इस बिंदु पर एक स्क्रूड्राइवर पर स्विचिंग समयपूर्व अनुकूलन नहीं है। यदि आप इस परियोजना को गंभीरता से लेना चाहते हैं, और यह खिलौने से अधिक है, तो इस तरह के विचारों को पूरी तरह से समझ में आता है। यदि यह देखने के लिए केवल एक प्रयोग है कि एक रिलेशनल डेटाबेस ग्राफ को कितना अच्छा स्टोर कर सकता है, तो यह भी ठीक है, लेकिन चलिए इसे प्रश्न में जोड़ दें ताकि हम जान सकें कि यह मुख्य मंशा है। – ctcherry