আমি কি ভ্রচার কলামগুলিতে একটি নির্বিচার দৈর্ঘ্য সীমাটি যুক্ত করব?


35

পোস্টগ্রেএসকিউএল এর ডক্স অনুসারে VARCHAR, VARCHAR(n)এবং এর মধ্যে পারফরম্যান্সের পার্থক্য নেই TEXT

নাম বা ঠিকানা কলামে আমি একটি নির্বিচার দৈর্ঘ্য সীমা যুক্ত করব ?

সম্পাদনা করুন :

আমি জানি যে CHARপ্রকারটি অতীতের একটি প্রতিরূপ এবং আমি কেবল পারফরম্যান্সেই আগ্রহী নই তবে এরভিনের মতো অন্যান্য উপকার ও বুদ্ধি তাঁর আশ্চর্যজনক উত্তরে বলেছিলেন।

উত্তর:


45

উত্তর না হয়
আপনি varcharযদি এড়াতে পারেন তবে কোনও দৈর্ঘ্যের সংশোধক যুক্ত করবেন না । বেশিরভাগ সময়, আপনার যাইহোক আসলে দৈর্ঘ্যের সীমাবদ্ধতার প্রয়োজন হয় না। textসমস্ত অক্ষর ডেটা জন্য শুধু ব্যবহার করুন। আপনার varcharযদি আরডিবিএমএসের সাথে সামঞ্জস্যপূর্ণ থাকতে হয় তবে এটি (কোনও দৈর্ঘ্যের সংশোধক নয়) করুন text

পারফরমেন্স প্রায় একই হয় - textহয় একটু বিরল পরিস্থিতিতে দ্রুত , এবং আপনি দৈর্ঘ্যের উপর চেক জন্য চক্র সংরক্ষণ।

আসলে আপনি যদি প্রয়োজন সর্বাধিক দৈর্ঘ্য জোরদার করা, এখনও ব্যবহার textএবং যোগ চেক বাধ্যতা যে জন্য:

ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 51);

আপনি টেবিল সংজ্ঞা এবং সমস্ত নির্ভরশীল অবজেক্ট (ভিউ, ফাংশন, বিদেশী কী, ...) নিয়ে ঝামেলা ছাড়াই যে কোনও সময় এই জাতীয় প্রতিবন্ধকতা সংশোধন বা বাদ দিতে পারেন (

দৈর্ঘ্য সংশোধকগুলির সাহায্যে আপনি কেবল এই বা এই বা এই জাতীয় সমস্যার মধ্যে চলে যান ...

PostgreSQL 9.1 ব্যথা কিছুটা কমিয়ে আনতে একটি নতুন বৈশিষ্ট্য চালু করেছে। আমি এখানে প্রকাশের নোটগুলি উদ্ধৃত করেছি :

ALTER TABLE ... SET DATA TYPEউপযুক্ত ক্ষেত্রে টেবিলের পুনর্লিখনগুলি এড়াতে মঞ্জুরি দিন (নোয়া মিস, রবার্ট হাস)

উদাহরণস্বরূপ, varcharকলামটিকে পাঠ্যে রূপান্তর করতে আর সারণীর পুনর্লিখনের প্রয়োজন নেই। তবে, একটি varcharকলামে দৈর্ঘ্যের সীমাবদ্ধতা বাড়ানোর জন্য এখনও একটি টেবিল পুনর্লিখনের প্রয়োজন।


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

হ্যাঁ, সবগুলি 9.1 - 6 বছর আগে পোস্টগ্র্রেস সংস্করণে ভিত্তিক। এতক্ষণে কিছুটা ধূলোবালি হলেও প্রাথমিক পরামর্শটি এখনও ভাল।
এরউইন ব্র্যান্ডসেটেটার

স্যানিটি চেক করার উদ্দেশ্যে প্রতিটি পাঠ্য কলামের জন্য একটি চেক সীমাবদ্ধতা যুক্ত করা এবং ক্লায়েন্টে কোনও বাগটি নিশ্চিত করা কোনও খুব বড় পাঠ্য সন্নিবেশ করে সমস্ত ডাটাবেসের ডিস্কের স্থান ব্যবহার করে না কি ভাল বা খারাপ ধারণা?
কোড 19

@ কোড: এটি একটি কার্যকর বিকল্প। আপনার যদি একই সীমাবদ্ধতার সাথে অনেকগুলি কলাম থাকে তবে ডোমেনগুলি বিবেচনা করুন । বা varchar(n)সর্বোপরি সরলতার জন্য - যদি ডাউনসাইডগুলি সাধারণত আপনাকে প্রভাবিত করে না। (সীমা নয় নির্বিচারে আপনার ক্ষেত্রে যদি আপনি একটি আসল সর্বাধিক দৈর্ঘ্য জোরদার করতে চান।)
এরউইন Brandstetter

12

আপনি যদি ডেটাটি বৈধ করেছেন তা নিশ্চিত করার জন্য যদি আপনি দৈর্ঘ্যের সীমাটিকে এক ধরণের চেক সীমাবদ্ধতা হিসাবে দেখেন তবে হ্যাঁ একটি যুক্ত করুন। প্রকৃতপক্ষে আপনি সীমাটি দ্রুত পরিবর্তন করার জন্য দৈর্ঘ্যের সংজ্ঞা ব্যবহার না করে বরং একটি বাস্তব চেক সীমাবদ্ধতা ব্যবহার করতে চাইতে পারেন ।

একটি দৈর্ঘ্যের সীমা পরিবর্তন (বৃদ্ধি) করতে আপনাকে ALTER TABLEএমন একটি চালনা করতে হবে যা শেষ করতে দীর্ঘ সময় লাগতে পারে (টেবিলের পুনরায় লেখার কারণে) যার মধ্যে একটি অনন্য টেবিল লক প্রয়োজনীয়।

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

অপারেশনের সময় ক text, ক varcharবা varchar(5000)কলামের মধ্যে কোনও পার্থক্য নেই ।


সাধারণ কৌতূহলের বাইরে, আপনি কেন ভাবেন যে ডেটা ক্যাপচার করার সময় এই দৈর্ঘ্যের চেকটি ক্লায়েন্ট অ্যাপ্লিকেশনটিতে করা যায় না?
পাইরেটএপ

4
@ পাইরেট অ্যাপ: কারণ প্রায়শই একাধিক অ্যাপ্লিকেশন বা কিছু বাহ্যিক ডেটা উত্স থাকবে (রাত্রে ব্যাচের আমদানি ভাবেন)। এবং প্রায় সর্বদা ডেটাবেস (এবং ডেটা) এক অ্যাপ্লিকেশনের চেয়ে দীর্ঘস্থায়ী হয়।
a_horse_with_no_name

2

প্রশ্নটি বিশেষতঃ VARCHAR কলামগুলিতে স্বেচ্ছাসেবী দৈর্ঘ্যের সীমা যুক্ত করে কিনা ?

তার পক্ষে, উত্তরটি কেবল "না"। আপনার মতো একটি স্বেচ্ছাসেবী সীমা যুক্ত করা ন্যায়সঙ্গত করতে পারে না এমন কিছু নেই যা varchar(max)প্রচলিত কনভেনশনগুলিকে সমর্থন বা ব্যবহার করে varchar(255)। তবে, যদি বৈশিষ্টটি কোনও সীমাটিকে সম্বোধন করে তবে আমি মনে করি উত্তরটি আরও জটিল হয়ে উঠেছে বিশেষত পোস্টগ্র্যাসকিউএল এর আধুনিক সংস্করণগুলিতে। এবং, এর জন্য, আমি হ্যাঁ হয়ে থাকব ।

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

আমার উত্তর থেকে এখানে, CHAR বনাম VARCHAR (Postgres) এর জন্য সূচক কর্মক্ষমতা , যেখানে আমি মেটা-ডেটার মানকে সম্বোধন করি।

যদি আমি এমন একটি স্পেস পেয়েছি যেটির পরিবর্তনশীল দৈর্ঘ্যের পাঠ্য-কীগুলি অর্থবহ ছিল এবং আমি স্থির সর্বাধিক দৈর্ঘ্যের জন্য বিশ্বাস করি তবে আমিও এটি ব্যবহার করব varchar। তবে আমি সেই মানদণ্ডের সাথে খাপ খায় এমন কোনও বিষয় ভাবতে পারি না।


1

দেখে মনে হচ্ছে কিছুটা পারফরম্যান্স পার্থক্য থাকতে পারে যদি VARCHARনিয়মিতভাবে খুব বড় স্ট্রিংগুলি সঞ্চয় করতে ব্যবহৃত হয়, যেহেতু "দীর্ঘ স্ট্রিংগুলি স্বয়ংক্রিয়ভাবে সিস্টেম দ্বারা সংকুচিত হয়" এবং "খুব দীর্ঘ মানগুলি ব্যাকগ্রাউন্ড টেবিলগুলিতেও সংরক্ষণ করা হয়।" তাত্ত্বিকভাবে এর অর্থ হ'ল খুব দীর্ঘ স্ট্রিং ফিল্ডের জন্য একটি উচ্চ ভলিউমের অনুরোধগুলি একটি ছোট স্ট্রিং ফিল্ডের চেয়ে ধীর হবে। নাম এবং ঠিকানা খুব বেশি দীর্ঘ হবে না বলে আপনি সম্ভবত এই সমস্যায় পড়বেন না।

তবে, আপনি কীভাবে আপনার ডাটাবেসের বাইরে এই স্ট্রিংগুলি ব্যবহার করছেন তার উপর নির্ভর করে আপনি সিস্টেমটির অপব্যবহার রোধ করতে ব্যবহারিক সীমা যুক্ত করতে চাইতে পারেন। উদাহরণস্বরূপ, আপনি যদি কোনও ফর্মের নাম এবং ঠিকানা প্রদর্শন করছেন তবে আপনি "নাম" ক্ষেত্রে পাঠ্যের পুরো অনুচ্ছেদটি প্রদর্শন করতে পারবেন না, সুতরাং নাম কলামটি 500 এর মতো কিছুতে সীমাবদ্ধ করা বোধগম্য হবে would অক্ষর।


1
আফাইক টোস্টিং বারচার এবং পাঠ্য ক্ষেত্রে কোনও পার্থক্য নেই।
dezso

VARCHARTEXTপোস্টগ্রিসে খাঁটি সিনট্যাকটিক চিনি , স্টোরেজ হ্যান্ডলিংয়ে শূন্য পার্থক্য রয়েছে; আপনি যে সংকোচনের বনাম পটভূমি সারণী স্টোরেজ উল্লেখ করেছেন তা কলামে ডেটাটির প্রকৃত দৈর্ঘ্যের ভিত্তিতে সম্পন্ন হয় কলাম মেটাডেটা নয়। টেক্সট কলামগুলি অভ্যন্তরীণভাবে একটি varlenaসি স্ট্রাক্ট হিসাবে সংরক্ষণ করা হয় (এটি একটি পরিবর্তনশীল দৈর্ঘ্যের অ্যারে যা প্রথম 4 বাইট তৈরি / আপডেটে দৈর্ঘ্য সংরক্ষণ করে) এবং এটি এই কাঠামোর দৈর্ঘ্যের ভিত্তিতে অনুকূলিত হয়।
কাউবার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.