Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

रिलेशनल डेटाबेस में कस्टम फ़ील्ड के लिए डिज़ाइन पैटर्न

VALUE . को बदलकर कड़े टाइप किए गए डेटा से बचें NUMBER_VALUE . के साथ , DATE_VALUE , STRING_VALUE . वे तीन प्रकार अधिकांश समय काफी अच्छे होते हैं। यदि आवश्यक हो तो आप बाद में XMLTYPE और अन्य फैंसी कॉलम जोड़ सकते हैं। और Oracle के लिए, स्थान बचाने के लिए CHAR के बजाय VARCHAR2 का उपयोग करें।

हमेशा मानों को सही प्रकार के रूप में संग्रहीत करने का प्रयास करें। मूल डेटा प्रकार तेज़, छोटे, उपयोग में आसान और सुरक्षित होते हैं।

Oracle में एक सामान्य डेटा प्रकार प्रणाली (ANYTYPE, ANYDATA, और ANYDATASET) है, लेकिन उन प्रकारों का उपयोग करना मुश्किल है और ज्यादातर मामलों में इससे बचा जाना चाहिए।

आर्किटेक्ट अक्सर सोचते हैं कि सभी डेटा के लिए एक ही फ़ील्ड का उपयोग करने से चीज़ें आसान हो जाती हैं। यह डेटा मॉडल की सुंदर तस्वीरें बनाना आसान बनाता है लेकिन यह सब कुछ और अधिक कठिन बना देता है। इन मुद्दों पर विचार करें:

  1. आप प्रकार को जाने बिना डेटा के साथ कुछ भी दिलचस्प नहीं कर सकते। यहां तक ​​​​कि डेटा प्रदर्शित करने के लिए यह जानना उपयोगी है कि पाठ को सही ठहराने के लिए किस प्रकार का है। 99.9% सभी उपयोग मामलों में उपयोगकर्ता के लिए यह स्पष्ट होगा कि 3 कॉलम में से कौन सा प्रासंगिक है।
  2. कड़े टाइप किए गए डेटा के विरुद्ध टाइप-सुरक्षित क्वेरी विकसित करना दर्दनाक है। उदाहरण के लिए, मान लें कि आप इस सहस्राब्दी में पैदा हुए लोगों के लिए "जन्म तिथि" खोजना चाहते हैं:

    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';
    

    आप नहीं चाहते कि प्रत्येक डेवलपर को उनके प्रश्नों को इस तरह लिखने के लिए कहें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. OPENJSON "'के साथ' कीवर्ड के पास गलत सिंटैक्स।" SQL सर्वर में (हल किया गया)

  2. SQL सर्वर को समझना ALTER TABLE ADD COLUMN Statement

  3. SQL सर्वर (T-SQL) में फ़ोन नंबर प्रारूपित करें

  4. जहां क्लॉज में स्ट्रिंग्स की सूची बनाने के लिए अल्पविराम से अलग किए गए स्ट्रिंग को पार्स करें

  5. SQL सर्वर डेटाबेस स्नैपशॉट -1