আমি পোস্টগ্রিএসকিউএল (9.4) ডাটাবেস সহ রুবি অন রেলে একটি অ্যাপ্লিকেশন বিকাশ করছি। আমার ব্যবহারের ক্ষেত্রে, টেবিলগুলিতে কলামগুলি খুব ঘন ঘন দেখা হবে, কারণ অ্যাপ্লিকেশনটির পুরো পয়েন্টটি একটি মডেলের খুব নির্দিষ্ট বৈশিষ্ট্য অনুসন্ধান করছে।
আমি বর্তমানে সিদ্ধান্ত নিচ্ছি যে কলামগুলির জন্য কোনও integer
টাইপ ব্যবহার করবেন বা সাধারণ স্ট্রিং টাইপ (উদাহরণস্বরূপ character varying(255)
, যা রেলগুলির মধ্যে পূর্বনির্ধারিত ) ব্যবহার করবেন কিনা তা আমি নিশ্চিত নই কারণ সূচীতে পারফরম্যান্সের পার্থক্য কী হবে তা আমি নিশ্চিত নই।
এই কলামগুলি enums হয় । তারা যতটা সম্ভব মান পেতে পারে তার জন্য তাদের একটি নির্দিষ্ট আকার রয়েছে। বেশিরভাগ এনাম দৈর্ঘ্য 5 এর বেশি হয় না, যার অর্থ সূচকটি কমবেশি প্রয়োগের আজীবন স্থির থাকবে ; সুতরাং, পূর্ণসংখ্যা এবং স্ট্রিং সূচকগুলি নোডের সংখ্যায় অভিন্ন হবে।
তবে সূচিযুক্ত স্ট্রিংটি প্রায় 20 টি অক্ষরের দীর্ঘ হতে পারে, যা স্মৃতিতে পূর্ণসংখ্যার প্রায় 5x হয় (যদি একটি পূর্ণসংখ্যা 4 বাইট হয়, এবং স্ট্রিংগুলি প্রতি অক্ষর 1 বাইটে খাঁটি ASCII হয়, তবে এটি ধারণ করে)। আমি জানি না কীভাবে ডাটাবেস ইঞ্জিনগুলি সূচক বর্ণনগুলি করতে পারে, তবে যদি এটি স্ট্রিংয়ের সাথে ঠিক মেলে না যায় তবে "স্ক্যান" করতে হয় , তবে সংক্ষেপে এর অর্থ দাঁড়ায় যে স্ট্রিংয়ের চেহারাটি একটি পূর্ণসংখ্যার চেয়ে 5x ধীর হতে পারে; পূর্ণসংখ্যার অনুসন্ধানের জন্য ম্যাচ হওয়া পর্যন্ত "স্ক্যান" 20 এর পরিবর্তে 4 বাইট হবে I'm আমি যা কল্পনা করছি:
দেখার মানটি (পূর্ণসংখ্যা) 4:
স্ক্যানিং ............................ ফাউন্ড | রেকর্ডস পাচ্ছে ... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | ... | |
দেখার মানটি (স্ট্রিং) "কিছু_ভল" (8 বাইট):
স্ক্যানিং ................................................. .................................... ফাউন্ড | রেকর্ডস পাচ্ছে ... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | ... | |
আমি আশা করি যে এটি উপলব্ধি করে। মূলত, কারণ পূর্ণসংখ্যাটি কম স্থান নেয়, এটি তার স্ট্রিং অংশের চেয়ে দ্রুত "ম্যাচ অন" হতে পারে। সম্ভবত এটি সম্পূর্ণ ভুল অনুমান, তবে আমি কোনও বিশেষজ্ঞ নই, এই কারণেই আমি আপনাকে বলছি! আমি মনে করি যে এই উত্তরটি আমি সবেমাত্র পেয়েছি তা আমার অনুমানকে সমর্থন করে বলে মনে হয় তবে আমি নিশ্চিত হতে চাই।
কলামে সম্ভাব্য মানগুলির একটিও একটির ব্যবহারে পরিবর্তন হবে না, সুতরাং সূচী নিজেই পরিবর্তন হবে না (যদি না আমি এনামে নতুন মান যুক্ত করি)। এই ক্ষেত্রে, ব্যবহারের ক্ষেত্রে পারফরম্যান্সের পার্থক্য থাকবে integer
বা varchar(255)
, বা একটি পূর্ণসংখ্যা টাইপ ব্যবহার করা আরও অর্থবোধ করে?
আমি জিজ্ঞাসা করার কারণটি হ'ল রেলগুলির enum
টাইপ ম্যাপগুলি স্ট্রিং কীগুলির সাথে পূর্ণসংখ্যা দেয়, তবে সেগুলি ব্যবহারকারী-মুখী কলামগুলি বোঝায় না। মূলত, আপনি যাচাই করতে পারবেন না যে এনাম মানটি একটি বৈধ, কারণ ArgumentError
কোনও বৈধতা চালানোর আগে একটি অবৈধ মান হ'ল কারণ । কোনও string
ধরণের ব্যবহার বৈধকরণের অনুমতি দেয়, তবে যদি কোনও পারফরম্যান্স ব্যয় হয় তবে আমি বৈধতা সমস্যাটি ঘুরিয়ে ফেলতে চাই।
varchar(255)
বনাম যেমন SQL সার্ভারে কোনও লুকানো অপ্টিমাইজেশন নেইvarchar(260)
। এসকিউএল সার্ভার x.x এর সাথে এমন কিছু থাকতে পারে তবে এটি দীর্ঘদিন ধরে সত্য নয়।