VALUE
. को बदलकर कड़े टाइप किए गए डेटा से बचें NUMBER_VALUE
. के साथ , DATE_VALUE
, STRING_VALUE
. वे तीन प्रकार अधिकांश समय काफी अच्छे होते हैं। यदि आवश्यक हो तो आप बाद में XMLTYPE और अन्य फैंसी कॉलम जोड़ सकते हैं। और Oracle के लिए, स्थान बचाने के लिए CHAR के बजाय VARCHAR2 का उपयोग करें।
हमेशा मानों को सही प्रकार के रूप में संग्रहीत करने का प्रयास करें। मूल डेटा प्रकार तेज़, छोटे, उपयोग में आसान और सुरक्षित होते हैं।
Oracle में एक सामान्य डेटा प्रकार प्रणाली (ANYTYPE, ANYDATA, और ANYDATASET) है, लेकिन उन प्रकारों का उपयोग करना मुश्किल है और ज्यादातर मामलों में इससे बचा जाना चाहिए।
आर्किटेक्ट अक्सर सोचते हैं कि सभी डेटा के लिए एक ही फ़ील्ड का उपयोग करने से चीज़ें आसान हो जाती हैं। यह डेटा मॉडल की सुंदर तस्वीरें बनाना आसान बनाता है लेकिन यह सब कुछ और अधिक कठिन बना देता है। इन मुद्दों पर विचार करें:
- आप प्रकार को जाने बिना डेटा के साथ कुछ भी दिलचस्प नहीं कर सकते। यहां तक कि डेटा प्रदर्शित करने के लिए यह जानना उपयोगी है कि पाठ को सही ठहराने के लिए किस प्रकार का है। 99.9% सभी उपयोग मामलों में उपयोगकर्ता के लिए यह स्पष्ट होगा कि 3 कॉलम में से कौन सा प्रासंगिक है।
-
कड़े टाइप किए गए डेटा के विरुद्ध टाइप-सुरक्षित क्वेरी विकसित करना दर्दनाक है। उदाहरण के लिए, मान लें कि आप इस सहस्राब्दी में पैदा हुए लोगों के लिए "जन्म तिथि" खोजना चाहते हैं:
select * from ReportFieldValue join ReportField on ReportFieldValue.ReportFieldid = ReportField.id where ReportField.name = 'Date of Birth' and to_date(value, 'YYYY-MM-DD') > date '2000-01-01'
क्या आप बग का पता लगा सकते हैं? उपरोक्त क्वेरी खतरनाक है, भले ही आपने तारीख को सही प्रारूप में संग्रहीत किया हो, और बहुत कम डेवलपर्स इसे ठीक से ठीक करना जानते हैं। Oracle में ऑप्टिमाइज़ेशन हैं जो संचालन के एक विशिष्ट क्रम को बाध्य करना मुश्किल बनाते हैं। सुरक्षित रहने के लिए आपको इस तरह की एक क्वेरी की आवश्यकता होगी:
select * from ( select ReportFieldValue.*, ReportField.* --ROWNUM ensures type safe by preventing view merging and predicate pushing. ,rownum from ReportFieldValue join ReportField on ReportFieldValue.ReportFieldid = ReportField.id where ReportField.name = 'Date of Birth' ) where to_date(value, 'YYYY-MM-DD') > date '2000-01-01';
आप नहीं चाहते कि प्रत्येक डेवलपर को उनके प्रश्नों को इस तरह लिखने के लिए कहें।