JSON स्ट्रिंग के भंडारण के लिए सबसे अच्छा SQL डेटाटाइप क्या है?


127

JSON स्ट्रिंग के भंडारण के लिए सबसे अच्छा SQL डेटाटाइप क्या है?

static List<ProductModel> CreateProductList()
{
    string json = @"[
        {
            ProductId: 1, 
            ProductCode: 'A', 
            Product: 'A'
        },
        {
            ProductId: 2, 
            ProductCode: 'B', 
            Product: 'B'
        }
    ]";

    IList<JToken> tokenList = JToken.Parse(json).ToList();
    List<ProductModel> productList = new List<ProductModel>();

    foreach (JToken token in tokenList)
    {
        productList.Add(JsonConvert.DeserializeObject<ProductModel>(token.ToString()));
    }

    return productList;
}

JSON युक्त ऐसी स्ट्रिंग को संग्रहीत करने के लिए हमें किस SQL ​​डेटाटाइप का उपयोग करना चाहिए?

  • NVARCHAR(255)?
  • TEXT?
  • VARBINARY(MAX)?

1
बस कुछ यादृच्छिक शोर (टिप्पणी, डेटा नहीं): आप इसे भी संक्षिप्त करना चाह सकते हैं। उस मामले में आपको कुछ बाइनरी की आवश्यकता होती है। दूसरी ओर: डेटा के लिए उचित तालिकाओं को केवल डिज़ाइन क्यों नहीं किया जाता है?
नाखून 23

3
@ द नेल: कभी-कभी कुछ JSON (या "दस्तावेज़" के रूप में) को संग्रहीत करने की आवश्यकता के लिए उचित है। जैसे एक वर्कफ़्लो इंजन या दस्तावेज़ प्रबंधन आदि के लिए ... मैं एक वर्तमान परियोजना पर कर रहा हूं, वास्तव में मेरे सीक्यूआरएस कार्यान्वयन के कमांड पक्ष के लिए दस्तावेज़ दृष्टिकोण से संबंधित है। यदि आप सर्विसस्टैक या JSON.Net जैसे धारावाहिक का उपयोग करते हैं तो यह बहुत तेज़ है।
स्वैनी

जवाबों:


198

निश्चित रूप से नहीं :

  • TEXT, NTEXT: उन प्रकारों को SQL Server 2005 के रूप में दर्शाया गया है और उन्हें नए विकास के लिए उपयोग नहीं किया जाना चाहिए। उपयोग VARCHAR(MAX)या NVARCHAR(MAX)इसके बजाय

  • IMAGE, VARBINARY(MAX): IMAGEजैसे बहिष्कृत हो गई है TEXT/NTEXT, और वहाँ वास्तव में एक द्विआधारी स्तंभ में एक पाठ स्ट्रिंग के भंडारण का कोई मतलब नहीं है ....

इसलिए कि मूल रूप से छोड़ देता है VARCHAR(x)या NVARCHAR(x): VARCHARगैर-यूनिकोड स्ट्रिंग्स (प्रति चरित्र 1 बाइट) को NVARCHARसंग्रहीत करता है और 2-बाइट-प्रति-चरित्र यूनिकोड मोड में सब कुछ संग्रहीत करता है। तो क्या आपको यूनिकोड की आवश्यकता है? क्या आपके तार, संभावित रूप से अरबी, हिब्रू, चीनी या अन्य गैर-पश्चिमी-यूरोपीय वर्ण हैं? फिर साथ जाओNVARCHAR

(N)VARCHARकॉलम दो रूपों में आता है: या तो आप अधिकतम लंबाई को परिभाषित है कि 8000 बाइट्स या उससे कम (में परिणाम VARCHARअप करने के लिए 8000 अक्षर, NVARCHAR4000), या अगर वह पर्याप्त नहीं है, का उपयोग करें(N)VARCHAR(MAX) संस्करणों, जो डेटा की 2 Gbyte तक जमा।

अद्यतन: SQL सर्वर 2016 में देशी JSON का समर्थन होगा - एक नया JSONडेटाटाइप (जो पर आधारित है nvarchar) पेश किया जाएगा, साथ ही साथ एकFOR JSON आउटपुट को JSON प्रारूप में क्वेरी से परिवर्तित करने के लिए कमांड भी दिया जाएगा।

# 2 अद्यतन करें: अंतिम उत्पाद में, Microsoft ने एक अलग JSONडेटाटाइप को शामिल नहीं किया - इसके बजाय, JSON-फ़ंक्शन (डेटाबेस की पंक्तियों को JSON में पैकेज करने के लिए, या JSON को रिलेशनल डेटा में पार्स करने के लिए) कई प्रकार के स्तंभों पर काम करते हैंNVARCHAR(n)


25
NVARCHAR को पसंदीदा विकल्प होना चाहिए क्योंकि sql सर्वर 2016 अपने मूल JSON समर्थन ब्लॉगs.msdn.com/b/jocapc/archive/2015/05/16/… के
Loudenvier

@marc_s क्या आपका "अपडेट" कथन सही है? मुझे कोई आधिकारिक JSON डेटा प्रकार नहीं मिल रहा है ...?
निक्स

2
@ निक्स: मुझे लगता है कि अंत में, SQL सर्वर JSON फ़ंक्शन का समर्थन करता है जो NVARCHAR(n)डेटा प्रकारों पर काम करता है
marc_s

2
आप अपने उत्तर को अद्यतन करने के लिए चाहते हो सकता है कि कोई स्टेट्स न हो कि एक जोंस डेटा टाइप हो
निक्स

1
varbinary (अधिकतम) का उपयोग संपीड़न के दौरान किया जा सकता है
Marat Gallyamov

31

मैं के लिए जाना जाएगा nvarchar(max)। कि आवश्यकता फिट होनी चाहिए।

अद्यतन: SQL Server 2016 और Azure SQL के साथ, अतिरिक्त देशी JSON क्षमताएं हैं। यह आपके डिजाइन या दृष्टिकोण को सकारात्मक रूप से प्रभावित कर सकता है। आप इसे और अधिक पढ़ सकते हैं: https://docs.microsoft.com/en-us/sql/relational-dat डेटाबेस / json / json-data-sql-server


8
क्या आपको वास्तव में 2-बाइट-प्रति-चरित्र यूनिकोड भंडारण की आवश्यकता है ?? अपने डेटा पर निर्भर करता है - (लेकिन यदि आप यह सिर्फ ज्यादा बाइट्स रूप में की जरूरत ... के रूप में दो बार बर्बाद कर रहा हो सकता है क्या - तो है कि जाने के लिए एक ही रास्ता है, मैं इस बात से सहमत! जरूरत यूनिकोड)
marc_s

5
nvarchar - क्योंकि डेटा परिभाषित नहीं है। अगर हमें लगता है कि सिस्टम को यूनिकोड की आवश्यकता नहीं होगी, तो हम varchar (max) पर जाने से बचा सकते हैं
कांगांक

5
इसके अलावा, nvarcharकोलाज़ के मुद्दों से बचने का उपयोग करते हुए आपके पास अंततः होगा varchar, लेकिन यह क्वेरी प्रदर्शन की तुलना में धीमा होगा varchar। अधिक जानकारी के साथ महान DBA प्रश्न
स्कॉट्टी .नेट

5
इस सवाल को इतने उभार कैसे मिले? तो यह कहता है कि किस डेटा प्रकार का उपयोग करना है, ठीक है ... लेकिन यह भी समझाने की कोशिश नहीं करता है कि यह सही विकल्प क्यों होगा।
stakx -

1
आप हमेशा varchar का उपयोग कर सकते हैं और किसी भी यूनिकोड वर्ण से बच सकते हैं। यह एक अच्छा तरीका है यदि आप अपने पाठ में कभी-कभार यूनिकोड चार्ट डालेंगे क्योंकि यह एक nvarchar
chrisb

3

nvarchar(max)यदि आप SQL 2016 या Azure SQL पर JSON सुविधाओं का उपयोग करने की योजना बनाते हैं, तो मैं इसका उपयोग करने की सलाह दूंगा।

यदि आप उन सुविधाओं का उपयोग करने की योजना नहीं बनाते हैं, तो आप varbinary(max)संयुक्त COMPRESS(और DECOMPRESS) कार्यों के साथ उपयोग कर सकते हैं । अधिक जानकारी: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/

COMPRESS और DECOMPRESS फ़ंक्शन मानक GZip संपीड़न का उपयोग करते हैं। यदि आपका क्लाइंट GZip संपीड़न (उदाहरण के लिए ब्राउज़र जो gzip सामग्री को समझता है) को संभाल सकता है, तो आप सीधे संपीड़ित सामग्री वापस कर सकते हैं। ध्यान दें कि यह प्रदर्शन / भंडारण व्यापार बंद है। यदि आप अक्सर कंप्रेस किए गए डेटा को क्वेरी करते हैं, तो आपके पास धीमा प्रदर्शन होता है क्योंकि टेक्स्ट को हर बार विघटित होना चाहिए।


SQL 2016 पर JSON की कौन सी विशेषताएँ हैं ?
किकेनेट


0

इसके लिए nvarchar (अधिकतम) बेहतर है, एक बात और आप इस तरह कर सकते हैं।

public class TableName
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
     
    public string FieldJson { get; set; }   //save json in this field and
      
    [NotMapped]
    public List<FieldList> FieldList  // get return list from this properity
    {
        get => !string.IsNullOrEmpty(FieldJson) ? JsonConvert.DeserializeObject<List<FieldList>>(FieldJson) : null; 
    }

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