2008-11-11 21 views
5

निम्न डेटा स्कीमा मान लीजिए:क्या रेल में एक यौगिक विदेशी कुंजी हो सकती है?

Usage 
====== 
client_id 
resource 
type 
amount 

Billing 
====== 
client_id 
usage_resource 
usage_type 
rate 

इस उदाहरण में, मैं कई संसाधनों, जिनमें से प्रत्येक कई मायनों में इस्तेमाल किया जा सकता है लगता है। उदाहरण के लिए, एक संसाधन widget है। Widgetsfoo एड हो सकता है और वे bar एड हो सकते हैं। Gizmo एस foo एड और bar एड भी हो सकता है। इन उपयोग प्रकारों को विभिन्न दरों पर बिल किया जाता है, संभवतः विभिन्न ग्राहकों के लिए भी अलग-अलग दरें। उपयोग तालिका में उपयोग (संसाधन का) प्रत्येक अवसर दर्ज किया जाता है। प्रत्येक बिलिंग दर (क्लाइंट, संसाधन, और प्रकार संयोजन के लिए) बिलिंग तालिका में संग्रहीत की जाती है।

एक has_many संबंध बनाने के लिए (वैसे, अगर इस डेटा स्कीमा इस समस्या दृष्टिकोण सही तरीका नहीं है, सुझाव बनाने कृपया।)

उस पर रूबी और ActiveRecord का उपयोग कर सकता है, बिलिंग से उपयोग करने के लिए ताकि मैं किसी दिए गए बिलिंग दर के लिए उपयोग उदाहरणों की एक सूची प्राप्त कर सकूं? क्या has_many, :through का सिंटैक्स है जो मुझे नहीं पता?

एक बार फिर, मैं गलत कोण से इस समस्या का सामना कर रहा हूं, इसलिए यदि आप बेहतर तरीके से सोच सकते हैं, तो कृपया बात करें!

उत्तर

6

स्पष्ट रूप से Composite Primary Keys के समर्थन के साथ रेल के ActiveRecord का विस्तार करने के लिए Sourceforge पर एक प्रोजेक्ट है। मैंने इस एक्सटेंशन का उपयोग नहीं किया है, लेकिन यह आपकी मदद कर सकता है। यह rubyforge पर एक मणि भी है।

संस्करण 2.0 के रूप में रेल पर सादा रूबी यौगिक प्राथमिक कुंजी (सीएफ HowToUseLegacySchemas) का समर्थन नहीं करता है। प्रत्येक तालिका में एक सिंगल-कॉलम होना चाहिए, "id" नामक ऑटो-वृद्धि कुंजी।

मैंने जो स्पष्टीकरण देखा है वह है: "यदि आप विरासत डेटाबेस का उपयोग करना चाहते हैं तो आपको केवल यौगिक प्राथमिक कुंजी की आवश्यकता है।" यह निश्चित रूप से डेटा मॉडलिंग का एक हास्यास्पद अज्ञान दृश्य है।

समाधान मैं देख रहा हूँ होगा:

  • Usage.client_id -> Client.id
  • Usage.type_id -> Usagetype.id
  • Usage.resource_id -> Resource.id
  • Billing.usage_id -> Usage.id
  • Billing.client_id -> Client.id
  • Billing.type_id -> Usagetype.id
  • Billing.resource_id -> Resource.id

आंशिक रेफेरेंन्शिअल सत्यनिष्ठा लागू करने के लिए Billing कोशिश में जाहिरा तौर पर अनावश्यक विदेशी कुंजी। लेकिन यह काफी नहीं मिलता है - यह आपको Billing में पंक्तियां बनाने से नहीं रोकता है जो गलत क्लाइंट/संसाधन/usagetype संयोजन के साथ Usage में पंक्ति को संदर्भित करता है, बिलिंग तालिका में संदर्भ पंक्ति में उनसे मेल नहीं खाता है।

संपादित करें: @ यरिक: हाँ, आप सही हैं। संदर्भ के लिए Usage के लिए यह अधिक समझ में आता है।

  • Usage.billing_id -> Billing.id

हम्म। मैंने एक ईआर आरेख बनाया लेकिन मुझे इसे एक छवि के रूप में डालने में परेशानी हो रही है।

+0

एक दूसरे ... यह अन्य किया जा नहीं करना चाहिए प्रतीक्षा करें रास्ते के आसपास - बिलिंग में एक प्राथमिक कुंजी और उपयोग में एक विदेशी कुंजी ?? – Yarik

+0

अच्छा जवाब, अच्छी पृष्ठभूमि। डेटाबेस के RoR दृश्य मुझे समस्याग्रस्त लगता है। लेकिन डीबीएमएस ने धीमी, असुरक्षित डेटाबेस हॉग के रूप में प्रतिष्ठा के साथ RoR को बोझ कर अपना बदला ठीक कर लिया है। – dkretz

1

आप किसी भी बाधा उत्पन्न कर सकते हैं जिसे आप माइग्रेशन में 'execute' कमांड के साथ चाहते हैं।

आप शायद कुछ त्रुटि हैंडलिंग जोड़ना चाहते हैं। बाधाओं को हल करने पर मामलों से निपटने के लिए बचाएं।

आप एआर के अंतर्निहित विधि जनरेटर का उपयोग नहीं कर सकते बिलिंग बंद उपयोगों उत्पन्न करने के लिए, लेकिन आप अभी भी विधि हो सकता है:

class Billing 
    def usages 
    Usage.find(:all, :conditions => ["x = ? and y = ?", self.x, self.y]) 
    end 
end 
संबंधित मुद्दे