পোস্টগ্র্রেএসকিউএল দ্বারা প্রবর্তিত জেএসওএনবির ব্যাখ্যা


346

পোস্টগ্রেএসকিউএল সবেমাত্র জেএসওএনবি চালু করেছে এবং এটি ইতিমধ্যে হ্যাকারের খবরে ট্রেন্ডিং করছে । যদি কেউ পোস্টগ্র্রেএসকিউএলে পূর্বে উপস্থিত হস্টোর এবং জেএসন থেকে কীভাবে আলাদা তা ব্যাখ্যা করতে পারে তবে এটি দুর্দান্ত। এর সুবিধাগুলি এবং সীমাবদ্ধতাগুলি কী এবং কখনই এটি ব্যবহার করার বিষয়টি বিবেচনা করা উচিত?


4
পিজিসন ২০১৪ থেকে: youtube.com/…
মিসানফোর্ড

5
@ ক্রেইগ্রিঞ্জার ইউআরএল যথেষ্ট সুনির্দিষ্ট নয়, এখন 1 বছর পরে এটি জেএসওএনবি-সম্পর্কিত সামগ্রীর পক্ষে যথেষ্ট পরিমাণেও নির্দেশ করে না।
বার্কাস

2
@ বার্কাস ভেবেছিলাম আমি নির্দিষ্ট পোস্টের সাথে লিঙ্ক করেছি। কত হতাশার।
ক্রেগ রিঞ্জার

1
এটি নির্দিষ্ট ভিডিওতে নির্দেশ করে।
টালঙ্ক্স

উত্তর:


457

প্রথমত, hstoreএকটি অবদানকারী মডিউল, যা আপনাকে কেবল কী => মান জোড়া সংরক্ষণ করতে দেয়, যেখানে কীগুলি এবং মানগুলি কেবলমাত্র textএস (যদিও মানগুলিও এসকিএল NULLএস হতে পারে )।

উভয়ই jsonএবং jsonbআপনাকে একটি বৈধ JSON মান সংরক্ষণ করতে দেয় (এটির বর্ণনায় সংজ্ঞায়িত )।

F.ex. এই বৈধ JSON উপস্থাপনা আছেন: null, true, [1,false,"string",{"foo":"bar"}], {"foo":"bar","baz":[null]}- hstoreশুধু একটু উপসেট কি তাদেরকে JSON সক্ষম তুলনায় (কিন্তু আপনি শুধুমাত্র এই উপসেট, এটা ঠিক আছে প্রয়োজন হলে)।

শুধুমাত্র মধ্যে পার্থক্য json& jsonbতাদের স্টোরেজ হল:

  • json যখন এর সরল পাঠ্য বিন্যাসে সংরক্ষণ করা হয়
  • jsonb কিছু বাইনারি উপস্থাপনায় সংরক্ষণ করা হয়

এর 3 টি বড় পরিণতি রয়েছে:

  • jsonb সাধারণত তুলনায় বেশি ডিস্ক স্পেস লাগে json (কখনও কখনও না)
  • jsonb এর ইনপুট উপস্থাপনা থেকে তৈরি করতে আরও সময় লাগে takes json
  • jsonঅপারেশনগুলি তুলনায় উল্লেখযোগ্য পরিমাণে বেশি সময় নেয় jsonb(& প্রতিটি jsonটাইপ করা মূল্যে কিছু অপারেশন করার সময় পার্সিংও করা দরকার )

jsonbস্থিতিশীল প্রকাশের সাথে কবে উপলব্ধ হবে, দুটি বড় ব্যবহারের ঘটনা ঘটবে, যখন আপনি তাদের মধ্যে সহজেই নির্বাচন করতে পারেন:

  1. আপনি যদি কেবল আপনার অ্যাপ্লিকেশনটিতে জেএসএন প্রতিনিধিত্ব নিয়ে কাজ করেন তবে পোস্টগ্রিএসকিউএল কেবলমাত্র এই উপস্থাপনা সংরক্ষণ এবং পুনরুদ্ধার করতে ব্যবহৃত হয়, আপনার ব্যবহার করা উচিত json
  2. আপনি যদি পোস্টগ্রেএসকিউএল এ জেএসওএন মান নিয়ে প্রচুর অপারেশন করেন বা কিছু জেএসওএন ক্ষেত্রে সূচক ব্যবহার করেন তবে আপনার ব্যবহার করা উচিত jsonb

1
হাই, যেহেতু এটি বাইনারি প্রতিনিধিত্ব করে, কেন jsonbএটি সমর্থন করে না? UPDATE test SET data->'a' = 123 WHERE id = 1;থেকেCREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
কোকিজু

1
কোকিজু, এটি 9.5 এ সম্ভব। wiki.postgresql.org/wiki/…
চেলোকেকোট

1
কেবল যোগ করার জন্য, আপনি যে কারণগুলিও ব্যবহার করতে পারেন jsonতার মধ্যে একটি jsonbহ'ল যদি উত্তরাধিকারগত কারণে আপনার কোডটি আপনার গ্রাহক ক্ষেত্রগুলির jsonক্রম উপর নির্ভর করে jsonএবং সেগুলি পুনরায় সাজানো যায় না।
djdrzzy

4
হিসাবে, উত্তরাধিকারগত কারণে: জেএসএনে, কোনও শব্দার্থগত পার্থক্য নেই, যদি কোনও বস্তুর (টেবিল, মানচিত্র, হ্যাশ, এটি হোস্ট ভাষায় যাহাই বলা হয়) কী-মান জোড়গুলি আলাদাভাবে অর্ডার করা হয়। যদি আপনি এর উপর নির্ভর করেন তবে আপনি আসলে জেএসওনের চেয়ে আলাদা কিছু ব্যবহার করছেন। - textবনামের জন্য json: দ্বিতীয়টি JSON বৈধকরণের সাথে আসে, সুতরাং অবৈধ JSON এর পরে, এটি কেবলমাত্র সন্নিবেশ করলেই ব্যর্থ হবে, প্রতিবার আপনার অ্যাপ্লিকেশনটি পড়ার পরিবর্তে (কারণ এটি একটি অবৈধ উপস্থাপনা পায়)। এছাড়াও, আপনি পরবর্তীকালে নিরাপদে jsonbডাটাবেসের মধ্যে কাস্ট করতে পারেন ।
pozs

2
এটি JSONB ( pgeoghegan.blogspot.com/2014/03/ কি- i
think

131

Peeyush:

সংক্ষিপ্ত উত্তরটি হ'ল:

  • যদি আপনি ভিতরে অনেকগুলি JSON ম্যানিপুলেশন করছেন যেমন বাছাই slicing, স্প্লাইসিং, ইত্যাদি পোস্টগ্রি, আপনি গতি কারণে JSONB ব্যবহার করা উচিত।
  • JSON এ স্বেচ্ছাসেবী কী অনুসন্ধানগুলির জন্য আপনার যদি সূচিকৃত অনুসন্ধানের প্রয়োজন হয় তবে আপনার জেএসওএনবি ব্যবহার করা উচিত।
  • আপনি যদি উপরের কোনওটি না করে থাকেন তবে আপনার সম্ভবত জেএসএন ব্যবহার করা উচিত।
  • আপনার যদি কী অর্ডারিং, হোয়াইটস্পেস এবং ডুপ্লিকেট কী সংরক্ষণ করতে হয় তবে আপনার JSON ব্যবহার করা উচিত।

দীর্ঘ উত্তরের জন্য, আপনাকে 9.4 রিলিজের কাছাকাছি পূর্ণ "হাওটো" রচনা আপ করার জন্য আমার অপেক্ষা করতে হবে।


74

জসন এবং জসনব (পোস্টগ্রিসপ্রফেশনাল দ্বারা মূল চিত্র ) এর মধ্যে পার্থক্যের একটি সহজ ব্যাখ্যা :

SELECT '{"c":0,   "a":2,"a":1}'::json, '{"c":0,   "a":2,"a":1}'::jsonb;

          json          |        jsonb 
------------------------+--------------------- 
 {"c":0,   "a":2,"a":1} | {"a": 1, "c": 0} 
(1 row)
  • জেসন: পাঠ্য স্টোরেজ is যেমনটি »
  • jsonb: কোন সাদা জায়গা নেই
  • jsonb: কোনও সদৃশ কী নেই, শেষ কী জয়
  • jsonb: কী বাছাই করা হয়

আরো বক্তৃতা ভিডিও এবং স্লাইড শো উপস্থাপনা jsonb ডেভেলপারদের দ্বারা। এছাড়াও তারা JsQuery প্রবর্তন করেছে , pg.extension শক্তিশালী jsonb ক্যোয়ারী ভাষা সরবরাহ করে


1
ধন্যবাদ, আমি এটি পাঠ্যে প্রতিস্থাপন করেছি
চেলোককোট

56
  • hstore এটি একটি "প্রশস্ত কলাম" স্টোরেজ প্রকারের বেশি, এটি কী-মান জোড়ার একটি ফ্ল্যাট (অ-নেস্টেড) অভিধান, সর্বদা যুক্তিযুক্ত দক্ষ বাইনারি ফর্ম্যাটে (একটি হ্যাশ টেবিল, সুতরাং নাম) সংরক্ষণ করা হয়।
  • jsonজেএসওএন ডকুমেন্টগুলি পাঠ্য হিসাবে সংরক্ষণ করে, দস্তাবেজগুলি সংরক্ষণ করার সময় বৈধতা সম্পাদন করে এবং প্রয়োজনে আউটপুটে পার্স করে (যেমন স্বতন্ত্র ক্ষেত্রগুলিতে অ্যাক্সেস করা); এটির পুরো জেএসএন স্পেক সমর্থন করা উচিত। যেহেতু পুরো JSON পাঠ্য সংরক্ষণ করা আছে তাই এর ফর্ম্যাটটি সংরক্ষণ করা আছে।
  • jsonbকর্মক্ষমতা কারণে শর্টকাট নেয়: JSON ডেটা ইনপুট-এ পার্স করা হয় এবং বাইনারি ফর্ম্যাটে সংরক্ষণ করা হয়, অভিধানে কী অর্ডারিংগুলি বজায় রাখা হয় না, এবং উভয়ই সদৃশ কী নয়। জেএসওএনবি ক্ষেত্রে পৃথক উপাদানগুলিতে অ্যাক্সেস করা দ্রুত কারণ এর জন্য JSON পাঠ্যকে পুরো সময় পার্স করার প্রয়োজন হয় না। আউটপুট এ, JSON ডেটা পুনর্গঠন করা হয় এবং প্রাথমিক ফর্ম্যাটিং হারিয়ে যায়।

আইএমও, সেখানে কোন উল্লেখযোগ্য কারণ নেই না ব্যবহার jsonbএকবার এটি পাওয়া যায়, আপনি যদি মেশিনে পাঠযোগ্য ডেটার সাথে কাজ করছে।


24

জেএসএনবি জেএসএনের একটি "আরও ভাল" সংস্করণ।

আসুন একটি উদাহরণ তাকান:

SELECT '{"c":0,   "a":2,"a":1}'::json, '{"c":0,   "a":2,"a":1}'::jsonb;
          json          |        jsonb 
------------------------+--------------------- 
 {"c":0,   "a":2,"a":1} | {"a": 1, "c": 0} 
(1 row)
  1. জেএসএন সাদা স্থান সঞ্চয় করে, এ কারণেই কী "এ" কী সংরক্ষণ করা হয় সেদিকে আমরা স্পেস দেখতে পারি, যখন জেএসওএনবি সংরক্ষণ করে না।
  2. জেএসওএন কী এর সমস্ত মান সংরক্ষণ করে। এই কারণেই আপনি কী "এ" কী এর বিপরীতে একাধিক মান (2 এবং 1) দেখতে পাচ্ছেন, তবে জেএসএনবি সর্বশেষ মানটি "সঞ্চয়" করে।
  3. জেএসওএন উপাদানগুলি যাতে সন্নিবেশ করা হয় সেটিকে বজায় রাখে, এবং জেএসওএনবি "সাজানো" ক্রম বজায় রাখে।
  4. জেএসএনবিতে "কাঁচা তথ্য" এর বিপরীতে জেএসএনবি অবজেক্টগুলি সংক্ষেপিত বাইনারি হিসাবে সংরক্ষণ করা হয়, যেখানে পুনরুদ্ধারের সময় ডেটা পুনর্বারকরণের প্রয়োজন হয় না।
  5. জেএসওএনবিও সূচকে সমর্থন করে, যা একটি উল্লেখযোগ্য সুবিধা হতে পারে।

সাধারণভাবে, জেএসওএনবির পছন্দ করা উচিত, যদি না বিশেষ প্রয়োজন হয়, যেমন অবজেক্ট কীগুলি অর্ডার করার বিষয়ে উত্তরাধিকার অনুমান।


13

আমি আজ পোগোপেনে ছিলাম মঞ্চডাবের চেয়ে মানদণ্ডগুলি দ্রুততর, আমি বিশ্বাস করি এটি নির্বাচনের ক্ষেত্রে প্রায় 500% দ্রুত ছিল। বেশ কিছুটা কমপক্ষে কমপক্ষে 200% দ্বারা দ্রুত ছিল যখন মঙ্গদ্ব্বের সাথে বিপরীত ছিল, তবে এখনই একটি ব্যতিক্রম একটি আপডেট যা পুরো জেসন কলামকে আবার পুরোপুরি পুনর্লিখনের জন্য প্রয়োজন যা মংডোব আরও ভালভাবে পরিচালনা করে।

জসনবতে জিন সূচকটি আশ্চর্যজনক মনে হচ্ছে।

এছাড়াও পোস্টগ্রিসগুলি অভ্যন্তরীণভাবে জসনব ধরণের প্রকার অব্যাহত রাখে এবং মূলত এর সাথে সংখ্যাসূচক, পাঠ্য, বুলিয়ান ইত্যাদির সাথে মেলে will

জসনব ব্যবহার করেও যোগ দেওয়া সম্ভব হবে

সঞ্চিত প্রক্রিয়াগুলির জন্য PLv8 যুক্ত করুন এবং এটি নোড.জেএস বিকাশকারীদের পক্ষে মূলত একটি স্বপ্ন হয়ে উঠবে।

এটি বাইনারি জসনব হিসাবে সঞ্চিত থাকায় সমস্ত সাদা স্থান ফাঁকা হয়ে যাবে, বৈশিষ্ট্যের ক্রম পরিবর্তন হবে এবং সম্পত্তির শেষ ঘটনাটি ব্যবহার করে সদৃশ বৈশিষ্ট্যগুলি মুছে ফেলা হবে।

সূচক ছাড়াও যখন কোনও জসনব কলামের বিপরীতে কোনও জসন কলাম পোস্টগ্রাসের বিপরীতে জিজ্ঞাসাবাদ করা হয় তখন প্রতিটি কাতারে পাঠ্যকে জসনতে রূপান্তর করতে কার্যকারিতা চালাতে হয় না যা সম্ভবত এককভাবে প্রচুর সময় সাশ্রয় করে।


8

jsonএবং jsonbডেটাটাইপগুলির মধ্যে পার্থক্য সম্পর্কে , এটি সরকারী ব্যাখ্যাটি উল্লেখ করার মতো:

পোস্টগ্রেএসকিউএল জেএসএন ডেটা সংরক্ষণের জন্য দুটি ধরণের অফার দেয়: jsonএবং jsonb। এই ডেটা ধরণের জন্য দক্ষ ক্যোয়ারী প্রক্রিয়া বাস্তবায়নের জন্য, পোস্টগ্রেএসকিউএল এছাড়াও বিভাগ 8.14.6 তে বর্ণিত জসনপথ ডেটা প্রকার সরবরাহ করে

jsonএবং jsonbডেটা প্রকার ইনপুট হিসাবে মূল্যবোধের প্রায় অনুরূপ সেট গ্রহণ। প্রধান ব্যবহারিক পার্থক্য দক্ষতা এক। jsonডাটা টাইপ দোকানে পাঠ্য ইনপুট, যা প্রক্রিয়াকরণের ফাংশন প্রতিটি ফাঁসি উপর reparse আবশ্যক একটি সঠিক অনুলিপি; যখন jsonbতথ্য একটি মধ্যে সংরক্ষিত হয়, বাইনারি ফর্ম্যাটে এটা সামান্য ইনপুট ধীর করে তোলে যোগ রূপান্তর ওভারহেড কারণে, কিন্তু উল্লেখযোগ্যভাবে প্রক্রিয়া দ্রুত পচে কারণ কোনো reparsing প্রয়োজন হয়।jsonbএছাড়াও সূচক সমর্থন করে, যা একটি উল্লেখযোগ্য সুবিধা হতে পারে।

যেহেতু jsonপ্রকারটি ইনপুট পাঠ্যের একটি সঠিক অনুলিপি সঞ্চয় করে, এটি টোকেনগুলির মধ্যে শব্দার্থ-তুচ্ছ সাদা স্থান সংরক্ষণ করবে, পাশাপাশি জেএসওএন অবজেক্টের মধ্যে কীগুলির ক্রমও সংরক্ষণ করবে। এছাড়াও, যদি মানটির মধ্যে কোনও JSON অবজেক্টে একই কীটি একাধিকবার থাকে তবে সমস্ত কী / মান জোড়া রাখা হয়। (প্রসেসিং ফাংশনগুলি অপারেটিভ হিসাবে সর্বশেষ মানটিকে বিবেচনা করে)) বিপরীতভাবে, jsonbসাদা স্থান সংরক্ষণ করে না, অবজেক্ট কীগুলির ক্রম সংরক্ষণ করে না এবং নকল বস্তু কীগুলি রাখে না। যদি ডুপ্লিকেট কীগুলি ইনপুটটিতে নির্দিষ্ট করা থাকে তবে কেবল শেষ মানটি রাখা হয়।

সাধারণভাবে, বেশিরভাগ অ্যাপ্লিকেশনগুলিকে জেএসএন ডেটা সংরক্ষণ করতে পছন্দ করা উচিত jsonb, যদি না বেশ কয়েকটি বিশেষ চাহিদা থাকে যেমন অবজেক্ট কীগুলি অর্ডার করার বিষয়ে উত্তরাধিকার অনুমান।

পোস্টগ্রিএসকিউএল প্রতি ডাটাবেসটিতে কেবল একটি অক্ষর সেট এনকোডিংয়ের অনুমতি দেয়। সুতরাং ডাটাবেস এনকোডিংটি ইউটিএফ 8 না হওয়া পর্যন্ত জেএসএন প্রকারের পক্ষে জেএসওএন নির্দিষ্টকরণের সাথে কঠোরভাবে মানা সম্ভব নয়। ডাটাবেস এনকোডিংয়ে প্রতিনিধিত্ব করা যায় না এমন অক্ষরগুলিকে সরাসরি অন্তর্ভুক্ত করার চেষ্টা ব্যর্থ হবে; বিপরীতে, যে অক্ষরগুলি ডেটাবেস এনকোডিংগুলিতে প্রতিনিধিত্ব করা যায় তবে ইউটিএফ 8 তে তা অনুমোদিত নয়।

সূত্র: https://www.postgresql.org/docs/current/datatype-json.html


7

আর একটি গুরুত্বপূর্ণ পার্থক্য, যা উপরের কোনও উত্তরে উল্লেখ করা হয়নি, তা হ'ল jsonটাইপের জন্য কোনও সমতা অপারেটর নেই , তবে এর জন্য একটি রয়েছে jsonb

এর অর্থ আপনি ব্যবহার করতে পারবেন না DISTINCTশব্দ এই নির্বাচন jsonএকটি টেবিল থেকে টাইপ এবং / অথবা অন্যান্য ক্ষেত্র (আপনি ব্যবহার করতে পারেন DISTINCT ONপরিবর্তে, কিন্তু এটা কারণ মত ক্ষেত্রে সম্ভব সবসময় নয় এই )।


6

আমি যতটুকু বলতে পারি,

  • hstore হিসাবে এটি বর্তমানে বিদ্যমান রয়েছে (Postgresql 9.3 এ) অন্যান্য অবজেক্ট এবং অ্যারেটিকে এর কী / মান জোড়ার মান হিসাবে বাসা বাঁধার অনুমতি দেয় না। তবে ভবিষ্যতের এই হস্টোর প্যাচ বাসা বাঁধার অনুমতি দেবে। এই প্যাচটি 9.4 রিলিজে থাকবে না এবং শীঘ্রই কোনও সময় অন্তর্ভুক্ত করা যাবে না।

  • JSON যেমন বর্তমানে বিদ্যমান আছে পাখির জন্য অনুমতি, কিন্তু পাঠ্য-ভিত্তিক, এবং ইন্ডেক্স জন্য মঞ্জুরি দেয় না, এইভাবে এটি "ধীর"

  • জেসনব 9.4 এর সাথে প্রকাশিত হবে জেএসনের বর্তমান বাসা বাঁধার ক্ষমতা, পাশাপাশি জিন / জিআইএসটি উপকেন্দ্রের সূচীকরণ, তাই এটি দ্রুত হবে

পোস্টগ্রাফিকেল ৯.৪-তে কাজ করা লোকেরা বলে মনে হচ্ছে যে নতুন, দ্রুত জসনব টাইপ এমন লোকদের কাছে আবেদন করবে যারা মঙ্গোডিবি-র মতো নোএসকিউএল ডেটা স্টোর ব্যবহার করতে বেছে নিয়েছিল, তবে এখন একটি ছাদের নীচে ক্যোরি-সক্ষম অ-কাঠামোগত ডেটার সাথে একটি সম্পর্কিত ডেটাবেস একত্রিত করতে পারে

http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html

পোস্টগ্র্যাসকিএল 9.4 জসনব এর বেঞ্চমার্কগুলি মঙ্গোডিবির তুলনায় বা কিছু ক্ষেত্রে দ্রুত সমান বলে মনে হচ্ছে

http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb

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