2011-01-05 16 views
11

मैं समझता हूं कि रेल दर्शन के अनुसार, डेटाबेस स्तर के विपरीत डेटा स्तर पर डेटा अखंडता जांच की जानी चाहिए। कई अन्य डेवलपर्स की तरह, मैं उत्साह से असहमत हूं।रेल में विदेशी कुंजी 3

मुझे इस समस्या को संबोधित करने में बहुत सी चर्चाएं मिली हैं, लेकिन वे सभी पुराने लगते हैं और निराशाजनक रूप से, वे अलग-अलग समाधानों को इंगित करते हैं।

मुझे कल्पना करना है कि रेल 3 में विदेशी कुंजी बाधाओं का एक वास्तविक तथ्य है। हालांकि, जो कुछ भी है (यदि यह अस्तित्व में है) सभी पिछली चर्चाओं से परेशान है क्योंकि मुझे नहीं मिल रहा है यह।

क्या इस बिंदु से रेल डेवलपर्स अधिकतर एक ही पृष्ठ पर विदेशी कुंजी के साथ हैं? यदि ऐसा है, तो मुझे यह जानना अच्छा लगेगा कि उन्हें आम तौर पर कैसे संभाला जाता है।

उत्तर

6

इस कारण से मैं (और जो लोग एंटरप्राइज़ रेल - http://oreilly.com/catalog/9780596515201 लिखते हैं) अनुशंसा करते हैं कि आप SQL में अपना संपूर्ण ऊपर और नीचे माइग्रेशन लिखें।

लाभ हैं:

  • तालिका निर्माण पर विदेशी कुंजी को जोड़ने की क्षमता - tsvectors तरह
  • यह आप की अनुमति देता है - एक अलग बदलने तालिका
  • यह आप डेटाबेस विशिष्ट क्षेत्र प्रकार का उपयोग करने की अनुमति देता है बिना अनुक्रमित के विभिन्न प्रकार जोड़ने के लिए - जिन या सार
  • की तरह यह आप कार्यों लिखने के लिए अनुमति देता है और/या चलाता है
  • आप अभ्यस्त क्या डीएसएल प्रकार के लिए क्या एसक्यूएल क्षेत्र Ty संबंधित है याद पे - उदा। :

    • यह डेटाबेस नास्तिक (? कौन परवाह करता है और कितनी बार आप अपने डेटाबेस बदल जाएगा)
    • यह रूबी नहीं है (लेकिन हर अच्छे रेल डेवलपर एसक्यूएल पता होना चाहिए नहीं है: संख्या

    नुकसान कर रहे हैं , सही?)

लेकिन कुल मिलाकर, मुझे नुकसान का नुकसान उठाने का लाभ माना जाता है।

त्वरित उदाहरण:

def self.up 
    execute <<EOS 

create table .... (
    .... 
); 

EOS 
    end 
+0

अच्छा जवाब। क्या मैं हेड्रोक के '<< - EOS' रूप का उपयोग करने का सुझाव दे सकता हूं? इस तरह आपको कॉलम 0 – noodl

+0

हाँ पर सबकुछ संरेखित करने की आवश्यकता नहीं है, यद्यपि यह पूरी तरह से उचित है - हालांकि - थोड़ा अजीब लग रहा है और यह सुनिश्चित करना चाहता हूं कि मेरा एसक्यूएल ठीक से संरेखित हो - खासकर अगर कुछ फ़ंक्शन/ट्रिगर्स को उसी में लिखना पलायन। –

+0

मुझे लगता है कि मैं यही करूँगा। जिज्ञासा से बाहर, क्या इसका मतलब यह होगा कि मैं अपनी मेज और मॉडल उत्पन्न करने में सक्षम नहीं होगा, एक में झुकाव गिर गया? क्या मुझे एसक्यूएल में अपनी टेबल परिभाषा लिखनी होगी और फिर अलग-अलग मिलान मॉडल बनाना होगा? –

1

http://guides.rubyonrails.org/migrations.html#active-record-and-referential-integrity

"हालांकि सक्रिय रिकॉर्ड इस तरह की सुविधाओं के साथ सीधे काम करने के लिए किसी भी उपकरण प्रदान नहीं करता है, पर अमल विधि मनमाने ढंग से एसक्यूएल निष्पादित करने के लिए इस्तेमाल किया जा सकता। वहाँ भी इस तरह के foreign_key_migrations जो विदेशी कुंजी जोड़ने के रूप में प्लग इन की संख्या में हैं सक्रिय रिकॉर्ड के लिए समर्थन। "

0

मुझे लगने दूसरे दिन एक ही सवाल पूछ रहा है, इसलिए मैं कुछ शोध किया और an answer to an older but similar Stack Overflow question में मेरा निष्कर्ष collated। मुझे उम्मीद है कि इसका उपयोग है।

Btw, जब आप कहते हैं कि आप "उत्साह से असहमत" है कि डेटा अखंडता की जाँच करता आवेदन स्तर के रूप में डेटाबेस के स्तर का विरोध करने पर किया जाना चाहिए, मुझे लगता है तुम्हारा मतलब है कि वे दोनों स्तर पर किया जाना चाहिए, न कि बस डेटाबेस में।मुझे आशा है कि मैं यह सोचने में सही हूं कि लगभग सभी सहमत हैं कि आवेदन स्तर पर अखंडता जांच करना एक अच्छी बात है, और यह कि एकमात्र विषय पर बहस की जा रही है कि क्या उन्हें डेटाबेस में किया जाना चाहिए डेटाबेस में किया जाना चाहिए।

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