JSON স্ট্রিং সংরক্ষণের জন্য সেরা এসকিউএল ডেটাটাইপ কী?


127

JSON স্ট্রিং সংরক্ষণের জন্য সেরা এসকিউএল ডেটাটাইপ কী?

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

কোন এসকিউএল ডেটাটাইপ জেএসওএনযুক্ত স্ট্রিং সংরক্ষণের জন্য ব্যবহার করা উচিত?

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

1
কিছু কিছু এলোমেলো শব্দ (মন্তব্য, ডেটা নয়): আপনি এটিও সংক্ষেপ করতে চাইতে পারেন। সেক্ষেত্রে আপনার বাইনারি কিছু দরকার। অন্যদিকে: কেন কেবল তথ্যের জন্য উপযুক্ত সারণীগুলি ডিজাইন করবেন না?
পেরেক

3
@ দ্য পেরেক: কখনও কখনও জেএসএন (বা "ডকুমেন্ট" হিসাবে) কিছু সঞ্চয় করা প্রয়োজনের জন্য উপযুক্ত। ওয়ার্কফ্লো ইঞ্জিন বা ডকুমেন্ট ম্যানেজমেন্ট ইত্যাদির মতো ... আমি আমার সিকিউআরএস বাস্তবায়নের কমান্ড সাইডের জন্য রিলেশনাল থেকে ডকুমেন্টের কাছে যাচ্ছি, এটি একটি বর্তমান প্রকল্পে করছি। আপনি যদি সার্ভিসস্ট্যাক বা জেএসএন.নেটের মতো সিরিয়ালাইজার ব্যবহার করেন তবে এটি খুব দ্রুত।
সোয়ানি

উত্তর:


198

অবশ্যই না :

  • TEXT, NTEXT: এই প্রকারগুলি এসকিউএল সার্ভার ২০০৫ হিসাবে অবহেলিত এবং নতুন বিকাশের জন্য ব্যবহার করা উচিত নয়। ব্যবহারের VARCHAR(MAX)বা NVARCHAR(MAX)পরিবর্তে

  • IMAGE, VARBINARY(MAX): IMAGEঠিক ঠিক তেমনি অবচয় করা হয় TEXT/NTEXT, এবং বাইনারি কলামে একটি পাঠ্য স্ট্রিং সংরক্ষণ করার আসলেই কোনও লাভ নেই ....

সুতরাং এটি মূলত ছেড়ে যায় VARCHAR(x)বা NVARCHAR(x): VARCHARনন-ইউনিকোড স্ট্রিংগুলি (অক্ষরে 1 বাইট) এবং storesNVARCHAR সঞ্চয় করে এবং 2-বাইট-প্রতি-চরিত্রে ইউনিকোড মোডে সমস্ত কিছু সঞ্চয় করে। তাহলে আপনার কি ইউনিকোড দরকার? আপনার স্ট্রিংগুলিতে সম্ভবত আরবি, হিব্রু, চীনা বা অন্যান্য অ-পশ্চিম-ইউরোপীয় অক্ষর রয়েছে? তারপর সাথে যানNVARCHAR

(N)VARCHARকলাম দুই স্বাদে আসে: হয় আপনি সর্বাধিক দৈর্ঘ্য নির্ধারণ যে 8000 বাইট বা তার কম (ফলাফল VARCHARপর্যন্ত 8000 অক্ষর, NVARCHAR4000 টি), অথবা যদি যথেষ্ট না, ব্যবহার(N)VARCHAR(MAX) সংস্করণ কোন ডেটা 2 GByte পর্যন্ত সঞ্চয় করুন।

আপডেট: এসকিউএল সার্ভার 2016 এর নেটিভ জেএসওএন সমর্থন থাকবে - একটি নতুন JSONডেটাটাইপ (যা ভিত্তিক nvarchar) প্রবর্তন করা হবে, পাশাপাশি একটিFOR JSON একটি কোয়েরি থেকে আউটপুটটিকে জেএসএন ফর্ম্যাটে রূপান্তর করার জন্য একটি আদেশও দেওয়া হবে

আপডেট # 2: চূড়ান্ত পণ্যটিতে মাইক্রোসফ্ট একটি পৃথক JSONডেটাটাইপ অন্তর্ভুক্ত করেনি - পরিবর্তে, অনেকগুলি জেএসওএন-ফাংশন রয়েছে (ডাটাবেস সারিগুলিকে জেএসএন-এ প্যাকেজ করতে, বা জেএসএনকে রিলেশনাল ডেটাতে পার্স করতে) যা টাইপের কলামগুলিতে কাজ করেNVARCHAR(n)


25
NVARCHAR পছন্দের পছন্দ হিসাবে SQL সার্ভার 2016 তার নেটিভ তাদেরকে JSON সমর্থনের জন্য এটি ব্যবহার হওয়া উচিত blogs.msdn.com/b/jocapc/archive/2015/05/16/...
Loudenvier

@marc_s আপনার "আপডেট" বিবৃতিটি কি সঠিক? আমি কোনও অফিসিয়াল JSON ডেটা টাইপ খুঁজে পাচ্ছি না ...?
নিক্স

2
@ নিক্স: আমি মনে করি শেষ পর্যন্ত, এসকিউএল সার্ভার NVARCHAR(n)
জেএসএন

2
কোনও জসন ডেটা টাইপ রয়েছে তা না জানিয়ে আপনি নিজের উত্তরটি আপডেট করতে চাইতে পারেন
নিক্স

1
সংকোচন ব্যবহার করার সময়
ভেরিবিনারি

31

আমি যেতে হবে nvarchar(max)। যে প্রয়োজন মাপসই করা উচিত।

আপডেট: এসকিউএল সার্ভার 2016 এবং অ্যাজুরি এসকিউএল সহ, অনেকগুলি অতিরিক্ত নেটিভ জেএসওএন ক্ষমতা রয়েছে। এটি আপনার নকশা বা পদ্ধতির ইতিবাচকভাবে প্রভাব ফেলতে পারে। আপনি এটি আরও পড়তে পারেন: https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server


8
আপনার কি সত্যিই 2-বাইট-প্রতি-চরিত্রের ইউনিকোড স্টোরেজ দরকার ?? আপনার ডেটা উপর নির্ভর করে - (কিন্তু আপনি তা শুধু অনেক বাইট হিসাবে প্রয়োজন ... দ্বিগুন নষ্ট করা যেতে পারে DO - তারপর যে যেতে একমাত্র উপায়, আমি একমত! প্রয়োজন ইউনিকোড)
marc_s

5
এনভারচার - কারণ ডেটা সংজ্ঞায়িত হয়নি। যদি আমরা মনে করি যে সিস্টেমে ইউনিকোডের প্রয়োজন হবে না, তবে আমরা ভারচর (সর্বাধিক) এ স্থানান্তরিত সংরক্ষণ করতে পারি
কংকান

5
এছাড়াও, ব্যবহারের সময় nvarcharআপনার শেষ পর্যন্ত থাকা জোটের সমস্যাগুলি এড়ানো ব্যবহার করা হয় varcharতবে এটি কোয়েরি পারফরম্যান্সের চেয়ে ধীর হবে varcharআরও তথ্যের সাথে দুর্দান্ত ডিবিএ প্রশ্ন
স্কটি ডটনেট

5
এই প্রশ্নটি এতগুলি উপার্জন কিভাবে পেল? সুতরাং এটি বলে যে কোন ডেটা ব্যবহার করতে হবে ঠিক আছে ... তবে এটি ব্যাখ্যা করার চেষ্টাও করে না কেন সঠিক পছন্দ হবে তা ।
স্টাকেক্স -

1
আপনি সর্বদা ভারচর ব্যবহার করতে এবং যেকোন ইউনিকোড অক্ষর থেকে বাঁচতে পারেন। এটি যদি আপনার এনভেরচারের সাহায্যে স্থান সাশ্রয় করে তবে আপনার পাঠ্যে মাঝে মাঝে ইউনিকোড অক্ষর থাকবে
ক্রিসব

3

nvarchar(max)আপনি যদি এসকিউএল 2016 বা অ্যাজুরি এসকিউএল-তে জেএসএন বৈশিষ্ট্যগুলি ব্যবহার করার পরিকল্পনা করেন তবে আমি ব্যবহার করার পরামর্শ দেব ।

আপনি যদি এই বৈশিষ্ট্যগুলি ব্যবহার করার পরিকল্পনা না করেন তবে আপনি (এবং ) ফাংশনগুলির varbinary(max)সাথে মিলিত ব্যবহার করতে পারেন । আরও তথ্য: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/COMPRESSDECOMPRESS

কমপ্রেস এবং ডিকম্প্রেস ফাংশনগুলি স্ট্যান্ডার্ড জিজেপ সংকোচনের ব্যবহার করে। যদি আপনার ক্লায়েন্ট GZip সংক্ষেপণ পরিচালনা করতে পারে (যেমন gzip সামগ্রী বোঝে এমন ব্রাউজার), আপনি সরাসরি সংক্ষেপিত সামগ্রী ফিরে আসতে পারেন। নোট করুন যে এটি পারফরম্যান্স / স্টোরেজ ট্রেড অফ। আপনি ঘন ঘন সংকুচিত ডেটা জিজ্ঞাসা করলে আপনার মাইগের ধীর গতিতে পারফরম্যান্স রয়েছে কারণ প্রতি বার পাঠ্যকে সংক্ষেপিত করতে হবে।


যা হয় তাদেরকে JSON এসকিউএল 2016 উপর অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে ?
কিকিনেট


0

এনভারচার (সর্বোচ্চ) এটির জন্য আরও ভাল, এছাড়াও আরও একটি জিনিস আপনি এটি করতে পারেন।

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

   
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.