ORM का उपयोग करते समय, अपने डेटाबेस डिज़ाइन में किन चीजों को देखना है


19

जब आप जानते हैं कि कुछ डेटाबेस डिज़ाइन को ऑब्जेक्ट रिलेटेड मैपर (ORM) विकिपीडिया का उपयोग करके एक्सेस किया जाएगा, तो क्या देखने के लिए कुछ डेटाबेस डिज़ाइन मिलेंगे ? एंटिटी फ्रेमवर्क NHibernate या LLBLGenPro भी देखें।

एक उदाहरण के रूप में, मैं SqlServer के RPC कॉल पर 2100 पैरामीटर सीमा नोट करूँगा। एलएलबीएलजेन का उपयोग करते समय और यौगिक प्राथमिक कुंजियों का उपयोग करते समय तालिकाओं में शामिल होने में यह एक समस्या है यौगिक यौगिकों के लिए एमएसडीएन लेख देखें


4
कोई अपराध नहीं है, लेकिन "1 से अधिक प्राथमिक कुंजी के साथ तालिकाओं में शामिल होना" .. यह तालिका के मूल नियमों में से एक को परिभाषित करता है, प्रति तालिका एक एकल पीके। वास्तव में आपका क्या मतलब था?
मरिअन

यह 2100 पैरामीटर सीमा को कैसे प्रभावित करता है? क्या आपके पास कई कॉलम हैं? इसके अलावा, मैं आपको "ऑब्जेक्ट-रिलेशनल मैपिंग" और "ऑब्जेक्ट-रोल मॉडलिंग" का
जॉन सौन्डर्स

यदि आप SQL 'IN' (LINQ array.Contains (सदस्य)) के मानों की एक बड़ी सूची पास करते हैं तो 2100 पैरामीटर की सीमा कभी-कभी एक समस्या होती है। हालाँकि, यह वास्तव में डेटाबेस डिजाइन के लिए कुछ भी नहीं है; यह एक क्वेरी पैटर्न समस्या का अधिक है। ORM के लिए सबसे आसान समाधान जो 'पीड़ित' है, वह है कि सूची को एक [स्थायी] अस्थायी तालिका में डालें और उस में शामिल हों और / या एक सबक्वेरी का उपयोग करें जहां से वे उत्पन्न होते हैं, जहां से आइटम का चयन किया जाना है। (एसक्यूएल 'IN' के लिए हजारों आइटम पास करना वैसे भी आम तौर पर बुरा होता है, चाहे आप ओआरएपी का उपयोग कर रहे हों या नहीं)।
क्रिस्टोफ़रए

@ जॉन, यस ऑब्जेक्ट रिलेशनल मैपिंग
BozoJoe

4
@BozoJoe: एक तालिका - परिभाषा के अनुसार - केवल एक प्राथमिक कुंजी हो सकती है। कोई डीबीएमएस नहीं है जो आपको एक ही तालिका के लिए एक से अधिक प्राथमिक कुंजी परिभाषित करने की अनुमति देगा।
a_horse_with_no_name

जवाबों:


17

मानक सामान्यीकरण तकनीकों के माध्यम से जाओ, मुख्य रूप से 3 सामान्य रूप में। कुछ ORM डेटाबेस स्तर पर परिभाषित रिश्तों पर उठा सकते हैं ताकि आपको मैन्युअल रूप से नहीं करना पड़े।

मैं वास्तव में दूसरे रास्ते पर जाऊंगा और पूछूंगा कि मुझे ओआरएम के बारे में क्या पता होना चाहिए। सुनिश्चित करें कि आप जानते हैं: - मैं प्रश्नों की रूपरेखा कैसे बनाऊँ? - मैं ORM को कैसे ओवरराइड कर सकता हूं और अपनी खुद की क्वेरी लिख सकता हूं? - क्या मैं इसके बजाय संग्रहित procs का उपयोग कर सकता हूं?

डेटाबेस ओआरएम अज्ञेय होना चाहिए, संभावना से अधिक, यह ऐप को आउटस्टैंड करेगा।


+1: "डेटाबेस ORM अज्ञेय होना चाहिए"। डेटाबेस डिजाइन और अच्छे ओआरएम के लिए मानकों को पूरा करना भी खुश होगा।
मिकसिम

12
  1. ORM को स्कीमा बनाने या अपडेट करने की अनुमति कभी न दें। हमेशा अपनी जेनरेट की गई एसक्यूएल को एक टेम्प्लेट के रूप में उपयोग करें लेकिन बदलाव करने से पहले इसके माध्यम से जाएं (मैंने देखा है कि हमारा ओआरएम निरर्थक अनुक्रमित है, खराब डेटा प्रकारों का उपयोग करें ... यह सब खराब सामान है)

  2. अपने ओआरएम क्या नहीं कर सकते हैं के बारे में पता है। कुछ समय के लिए Django ने ओआरएम के माध्यम से समूह का समर्थन नहीं किया जो एक दर्द था (फिर भी, विरासत प्रणाली मजेदार है!)। इसलिए ओआरएम की सीमाओं के बारे में पता होना डीबीए के लिए जरूरी है, भले ही वे ओआरएम के लिए कोड लिखने वाले न हों।

  3. समय-समय पर, अपने धीमी लॉग को पकड़ो, उन्हें mysqlslowlog के माध्यम से एकत्र करें, और शीर्ष 10 या तो देखें। मूल रूप से यह आपको उन प्रश्नों को दिखाएगा जो समग्र रूप से सबसे अधिक समय लेते हैं। एक क्वेरी जो केवल औसत 1 सेकंड में ली गई थी, लेकिन पिछले महीने में 50K बार भागा, उस समग्र रिपोर्ट पर एक अंगूठे की तरह चिपकेगी;)

मैं यह नहीं कहूंगा कि ओआरएम को पूरी तरह से डंप करने के लिए उतना ही चरम पर जाएं। यदि ओआरएम का उपयोग करने वाले आपके डेवलपर्स डीबीए नहीं हैं, तो उन्हें एसक्यूएल लिखने की संभावना है जो ओआरएम की तुलना में खराब या खराब है। तो आखिरकार यह डीबीए पर पड़ेगा कि वह क्या देखता है।


1
और एक संग्रहीत खरीद में बहुत जटिल तर्क रखने पर विचार करें। ओआरएम संग्रहित प्रोक्स को कॉल कर सकते हैं और बहुत ही जटिल तर्क के लिए, एक ट्यून को प्रदर्शन करना आसान है।
HLGEM

7

कुछ चीजें हैं जो मैं एक विरासत डेटाबेस के बारे में तुरंत ध्यान देता हूं जो ORM द्वारा बनाए गए डेटाबेस से अलग होता है जैसे Ruby के लिए Sequel और ActiveRecord

  1. सभी तालिकाओं में एक प्राथमिक कुंजी का उपयोग कहा जाता है 'id'। हाँ, यह ओवरराइड किया जा सकता है, लेकिन idडिफ़ॉल्ट है।
  2. तालिकाओं के लिए बहुवचन नामों का उपयोग।
  3. तालिकाओं और क्षेत्रों के वर्णनात्मक नाम बनाने वाले शब्दों को अलग करने के लिए अंडरस्कोर ("snakecase") का उपयोग।
  4. _idविदेशी कुंजियों में संलग्न का उपयोग: लेआउट आमतौर पर पसंद है referenced_table_id

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

मुझे नहीं पता कि ओआरएम के साथ अच्छा खेलने के लिए स्कीमा डिजाइन करने के लिए कोई सामान्य दिशानिर्देश हैं, लेकिन मुझे लगता है कि कुछ मानकों के होने से हम सभी को लाभ होगा। ORM के लिए निश्चित रूप से एक समय और स्थान है, खासकर यदि आप एक अच्छी OO भाषा का उपयोग कर रहे हैं और आप एक टाइट शेड्यूल पर हैं।


1
FYI करें: कई OR मैपर्स के लिए नामकरण कन्वेंशन के अंतर से निपटने के लिए उपकरण हैं। मेरे पास विज़ुअल स्टूडियो के लिए एक ऐड-इन है जो नियम-आधारित नामकरण के साथ एंटिटी फ्रेमवर्क और लिनक-टू-एसक्यूएल की देखभाल करता है; उस पर अधिक जानकारी के लिए huagati.com/dbmltools देखें ।
क्रिस्टोफ़र

1
आईडी फ़ील्ड के नामकरण के लिए एक SQL एंटीपैटर है और इसका उपयोग नहीं किया जाना चाहिए।
एचएलजीईएम

परवाह करने के लिए क्यों? जब हम एक-से-कई और कई-से-एक जैसे लुकअप करने की आवश्यकता होती है, तो हम तालिकाओं के बीच संबंधों को कैसे संभालते हैं? ओआरएम में मैं आईडी का उपयोग नहीं कर रहा हूं निश्चित रूप से प्रवाह के खिलाफ जा रहा हूं।
टिन मैन

2

यह निर्भर करता है (:)) कि आप क्या उपयोग कर रहे हैं या मैपर पर थोड़ा सा है, इसलिए कुछ समय शोध में लगाओ कि db ने प्रश्न समर्थन में OR mapper की क्या विशेषता है / समर्थन नहीं किया।

जैसे Microsoft के OR mappers SQL सर्वर के सभी अंतर्निहित डेटाटाइप्स का समर्थन नहीं करते हैं, कुछ नए / उन्नत TSQL सुविधाओं (पुनरावर्ती प्रश्न, अनुकूलक आदि को ध्यान में रखते हुए वसंत) का समर्थन नहीं करते हैं।

सिद्धांत रूप में , एक अच्छा या मैपर पर्याप्त लचीला होना चाहिए (और आपको मैप करने की अनुमति देता है) एक अच्छे ऑब्जेक्ट मॉडल के लिए एक अच्छी तरह से डिज़ाइन किया गया रिलेशनल डेटाबेस स्कीमा। हकीकत में, पहेली के सभी टुकड़ों के स्थान पर जाने से पहले हमारे पास अभी भी थोड़ा सा है; हालाँकि कई OR मैपर्स उन्नत मैपिंग का समर्थन करते हैं लेकिन यह अक्सर जटिल प्रश्नों और प्रदर्शन समस्याओं की कीमत पर आता है।

अच्छे db प्रदर्शन के लिए (और dba की पवित्रता को बनाए रखने के लिए :)) आपको अभी भी सर्वोत्तम प्रथाओं का पालन करना चाहिए, जब यह db योजनाबद्ध डिजाइन की बात आती है; पहले को सामान्य करें और जहाँ आवश्यक हो, वहाँ पर इसे असामान्य करें। कोड-साइड पर, अपने ऑब्जेक्ट मॉडल के साथ ओवरबोर्ड न जाएं ; भले ही OR मैपर जटिल विरासत मॉडल और संस्थाओं का समर्थन करता है जो कई तालिकाओं को एक साथ मिलाते हैं, ये ऐसे क्षेत्र भी हैं जहां आप डेटाबेस आदि पर अत्यधिक जटिल प्रश्नों को चलाने में परेशानी का जोखिम उठाते हैं प्रोफ़ाइल, प्रोफ़ाइल, प्रोफ़ाइल और बस ORM नहीं लेते हैं। जनरेट किए गए प्रश्न। ध्यान रखें कि या मैपर जनरेट किए गए प्रश्नों को अक्सर सामान्य एसक्यूएल प्रश्नों की तरह ही ट्वीक किया जा सकता है और यह कि ऑब्जेक्ट साइड पर दो कार्यात्मक समतुल्य क्वेरीज़ (जैसे लाइनक क्वेश्चन) कभी-कभी बहुत भिन्न एसक्यूएल प्रश्नों का परिणाम हो सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.