2010-06-16 12 views
12

यह देखते हुए कि आपको सामाजिक नेटवर्क, पूर्व फेसबुक में देखी गई एक समाचार फ़ीड को लागू करना है। वर्तमान में मैं एक न्यूज क्लास का उपयोग कर रहा हूं जिसमें एक पॉलिमॉर्फिक आचरण है जो किसी भी प्रकार की छवि, टिप्पणी, मैत्री, समूह सदस्यता, इत्यादि हो सकता है। जब भी कोई ऑब्जेक्ट बनाया जाता है, क्योंकि समाचार भी बनाया जाता है। यह एआर (एक्टिव रिकॉर्ड्स) के साथ ठीक काम कर रहा है, लेकिन जब मैं डीएम (डेटामैपर) या सेक्वेल पर स्विच करता हूं तो मुझे परेशानी होती है क्योंकि दोनों पोलिमोर्फिक एसोसिएशन का नाटकीय रूप से समर्थन नहीं करते हैं और इसका उपयोग हतोत्साहित करते हैं।पॉलिमॉर्फिक एसोसिएशन से बचने के लिए कैसे करें

एक वर्कअराउंड कई अलग-अलग तालिकाओं को मर्ज करने के लिए यूनियनों के साथ एक बड़े एसक्यूएल खंड का उपयोग करना होगा जिसे समाचार के रूप में माना जाना चाहिए। लेकिन इसमें कुछ कमीएं हैं, विशेष रूप से प्रदर्शन भयानक होगा।

तो मुझे आश्चर्य है कि बिना किसी प्रदर्शन के मेटा डेटा जोड़ने की संभावना होने पर अच्छा प्रदर्शन और कोई अन्य कमी नहीं होने पर पॉलिमॉर्फिक एसोसिएशन के बिना कैसे हल किया जाए?

उत्तर

21

अस्वीकरण: मैं सेक्वेल का मुख्य डेवलपर हूं।

इसके बारे में जाने का सबसे अच्छा तरीका आमतौर पर डेटा के साथ आप किस प्रकार की चीजें करना चाहते हैं इस पर निर्भर करता है। एक तरह से इसके बारे में जाने के लिए सभी संभव संबंधों के लिए विदेशी कुंजी कॉलम है:

news: 
    id 
    ... (Other columns) 
    image_id 
    comment_id 
    friendship_id 
    group_membership_id 

वास्तव में चीजों को इस तरह से एक सामान्य विदेशी कुंजी होने और एक वर्ग के नाम संग्रहण बनाम करने में कोई प्रदर्शन अंतर है। आलसी लोडिंग के लिए, आप केवल एक विदेशी कुंजी फ़ील्ड चुनें जो शून्य/न्यूल नहीं है, और लोड करने के लिए उपयुक्त एसोसिएशन चुनें। प्रश्न-प्रति-तालिका उत्सुक लोडिंग के लिए, आप बस एक ही समय में सभी संगठनों को लोड करते हैं। यह भी अधिक लचीला है कि आप जॉइन का उपयोग करके बेसब्री से लोड कर सकते हैं, जो पॉलिमॉर्फिक दृष्टिकोण के साथ संभव नहीं है। इसके अलावा, आपको वास्तविक संदर्भित अखंडता का लाभ मिलता है।

एक नकारात्मक पक्ष यह है कि यदि आप भविष्य में अधिक एसोसिएशन प्रकार जोड़ना चाहते हैं, तो आपको तालिका में विदेशी कुंजी जोड़नी होगी।

+0

धन्यवाद ... यह एक असली सरल लेकिन अच्छा विचार है :-)। इसके लिए मॉडल में कुछ बदलाव की आवश्यकता है (रेफरी के वास्तविक सहयोग को वापस करना) लेकिन यह ठीक होना चाहिए :) – gucki

+0

मुझे नहीं लगता कि यह वास्तव में समाधान है। यह वास्तव में उदासीनता की अवधारणा का वर्णन नहीं करता है संभावित रूप से 'व्यवसाय' या 'व्यक्ति' या 'आइटम' होने के नाते एक 'समीक्षा योग्य'। यहां तक ​​कि यदि आपके पास 'review_id',' person_id', 'item_id' में से प्रत्येक 'समीक्षा' तालिका में है, तो आपको वास्तव में यह जानने के लिए पहले गैर-शून्य फ़ील्ड को अवश्य मिलना चाहिए कि समीक्षा क्या इंगित कर रही है। उन मामलों के बारे में क्या है जहां एक विशेष संगठन कई अलग-अलग चीजों में से एक हो सकता है? – fatuhoku

2

यहाँ रेल में डेटाबेस स्तर पर बहुरूपी संघों के संदर्भ अखंडता को बनाए रखने के लिए एक मणि है:

https://github.com/mkraft/fides

इस पोस्टिंग के रूप में वहाँ SQLite3 और PostgreSQL के लिए एडेप्टर हैं।

अस्वीकरण: मैंने मणि लिखा था।

संबंधित मुद्दे