স্ট্রিং কীগুলির ব্যবহারকে সাধারণত একটি খারাপ ধারণা হিসাবে বিবেচনা করা হয় কেন?


24

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

দুটি সহজ উদাহরণ নিন, যদি এটি সাহায্য করে:

একটি এসকিউএল-মতো সারণী যেখানে সারিগুলি স্ট্রিং প্রাথমিক কী দ্বারা সূচিযুক্ত হয়।

একটি। নেট অভিধান যেখানে কীগুলি স্ট্রিং are


9
স্ট্রিং কীগুলি রাখা সাধারণভাবে খারাপ ধারণা নয়। আমি সন্দেহ করি যে এই বিবৃতিগুলি এমন একটি প্রসঙ্গে তৈরি করা হয়েছিল যেখানে আরও ভাল কী টাইপ পাওয়া যায়। আমার কাছে সর্বদা স্ট্রিং কী সহ নেট ডিকশনারী রয়েছে। আপনি কি এই দাবির কয়েকটি উদাহরণ দিতে পারেন?
কোডসইনচাওস

3
আপনি সাধারণত প্রাথমিক কীগুলি চান যা কোনও অবজেক্ট / সারির জীবনকালে পরিবর্তিত হয় না। সুতরাং উদাহরণস্বরূপ usernameযেমন কোনও usersটেবিলের প্রাথমিক কীটি সম্ভবত সেরা ধারণা নয় এবং আপনি একটি স্বয়ংক্রিয়-বৃদ্ধি আইডি পছন্দ করেন। তবে এটি usernameএকটি স্ট্রিং কেবল
ঘটনাবহুল

একটি ডাটাবেসে, বিবেচনা করুন কীভাবে পূর্ণসংখ্যার বিপরীতে স্ট্রিংগুলি সূচীকরণ করবে।

@ কোডস ইন চ্যাওস আমি আশা করি যে বেশিরভাগ ক্ষেত্রে আমি কোথায় খুঁজে পেয়েছি তা মনে রাখতে পারতাম তবে আপাতত আমি বিটটি পেস্ট করতে পারি যা আমাকে সমস্যাটি মনে করিয়ে দিয়েছে। এটি ভালভের একটি জিডিসি স্লাইডশো থেকে ছিল যা গেম সংলাপ এবং <কী = স্ট্রিং, মান = বস্তু> জোড়ায় বিশ্ব সম্পর্কে তথ্য সংরক্ষণের বিষয়ে আলোচনা করেছিল।

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

উত্তর:


17

মূলত দুটি জিনিসই এর সাথে সম্পর্কিত:

1) দেখার গতি (উদাহরণস্বরূপ পূর্ণসংখ্যার চেয়ে অনেক ভাল ভাড়া)

2) সূচকের আকার (যেখানে স্ট্রিং সূচকগুলি বিস্ফোরিত হবে)

এখন এটি আপনার প্রয়োজন এবং ডেটাसेटের আকারের উপর নির্ভর করে। যদি কোনও টেবিল বা কোনও সংগ্রহে এটিতে 10-20 উপাদান থাকে তবে কীটির প্রকারটি অপ্রাসঙ্গিক। স্ট্রিং কী দিয়ে এটি খুব দ্রুত হবে।

পিএস আপনার প্রশ্নের সাথে সম্পর্কিত নাও হতে পারে তবে ডাটাবেস কীগুলির জন্য গাইডগুলি খুব খারাপ বিবেচিত হয় (16 বাইট গাইড 4 বনাম পূর্ণসংখ্যা)। বৃহত ডেটা ভলিউমগুলিতে গাইডগুলি অনুসন্ধান স্লো করে।


সর্বদা নয় - ইনক্রিমেন্টাল জিআইডিগুলি সম্ভব। সূচীগুলি এখনও আরও বড় হবে, তবে দেখার দণ্ড প্রায় খারাপ হবে না।
স্যাম

7
আসলে তারা ভাল আছে। আপনাকে সময় ডিস্ক IO সময় এবং স্মৃতিতে মানগুলির তুলনা করার মধ্যে সম্পর্কটি দেখতে হবে। যেহেতু ডিস্ক অ্যাক্সেসের সময়গুলি মেমরি তুলনাকে ছাপিয়ে যায় তাই কেবলমাত্র ডাটাবেসের কর্মক্ষমতা বিশ্লেষণে গুরুত্বপূর্ণ বিষয় IO। কীটি কোনও জিইউইডি, স্ট্রিং বা পূর্ণসংখ্যা প্রকৃতই সমালোচনামূলক নয়। সূচকের আকারটি এক পৃষ্ঠায় কতগুলি সূচক মান ফিট করে তা প্রভাবিত করে, তবে কীটি 4 বাইট ইনট (যা যথেষ্ট পরিমাণে বড় নাও হতে পারে এবং ক্লায়েন্ট উত্পন্ন হতে পারে না) বা 16 বাইট মান একটি গুরুত্বপূর্ণ উদ্বেগ নয়। কিছু ডাটাবেসে সারিআইডি আকারের 16 বাইট হতে পারে।
আইপল

9

স্ট্রিংগুলিকে কী হিসাবে ব্যবহার করা বা আরও সঠিকভাবে, স্ট্রিং আক্ষরিকাকে কী হিসাবে ব্যবহার করা, খাঁটি কর্মক্ষমতা / দক্ষতার কারণগুলি আলাদা করে রেখে আরও একটি সমস্যা রয়েছে। টাইপস। আপনি যদি কোনও অভিধানে কী হিসাবে স্ট্রিং লিটারাল ব্যবহার করেন, আপনি যখন একটি "ReceiverId"হয়ে যান তখন আপনি নিজেকে একটি বাজে আশ্চর্যর জন্য সেট আপ করছেন "RecieverId"। মূল মানগুলি সংরক্ষণ করার জন্য ধ্রুবকগুলি সেট আপ করুন এবং যখনই আপনি অভিধানে অ্যাক্সেস করেন সেগুলি পুনরায় ব্যবহার করুন।

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


তুচ্ছ আইএমএইচও নয়। আমি কীগুলি "1"এবং "1 "একই টেবিলের ক্ষেত্রেও দেখেছি ।
PSWg

যখন আপনি মিশ্রণে কেস সংবেদনশীলতাও ফেলে দেন তখন আরও মজাদার হয়ে উঠুন। আমার সহ অনেকগুলি লোক প্রত্যক্ষ হয় যার মধ্যে সরাসরি হোঁচট খায়।
টনি হপকিনসন

কমপক্ষে কমপক্ষে ধ্রুবক ব্যবহারের চেয়েও ভাল, পরিবর্তে এক্সপ্রেশন ব্যবহার করা। এই পদ্ধতিতে আপনি পদ্ধতিগুলি / বৈশিষ্ট্য ইত্যাদির নামগুলি থেকে আপনার স্ট্রিংগুলি তৈরি করতে পারেন যাতে আপনার স্ট্রিংয়ের লুকগুলি ধরণের সুরক্ষিত এবং চুল্লী বান্ধব হয়ে যায়।
GoatInTheMachine

4

এখানে অনেক ট্রেড অফ রয়েছে। প্রকৃতপক্ষে আমি প্রায়শই স্ট্রিং কীগুলি ব্যবহার করি তবে প্রায়শই আমি যোগদানের জন্য সারোগেট মাধ্যমিক কীগুলি অন্তর্ভুক্ত করি (স্পষ্টত এটি অন্যভাবে হবে যদি আমি মাইএসকিউএল ব্যবহার করি তবে)। আমি এমনটি করি না এমন কেস রয়েছে।

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

আমি সাধারণত সরোগেট কীগুলি যুক্ত করার দুটি কারণ রয়েছে:

  1. প্রাকৃতিক কী কী তা সবসময় পরিষ্কার হয় না। কখনও কখনও এগুলি পরিবর্তন করতে হবে। একটি প্রাকৃতিক, সংমিশ্রিত কী পরিবর্তন করা যখন এটি যোগ দেয় এবং রেফারেন্সিয়াল অখণ্ডতার জন্য ব্যবহৃত হয় জটিল এবং ত্রুটির প্রবণ।

  2. সংমিশ্রিত কীগুলিতে পারফরম্যান্সে যোগ দিন সমস্যাযুক্ত এবং একবার আপনি প্রাকৃতিক কী রুটে নামলে আপনি সেখানে আটকে যান।

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

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

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


যদি আপনি পূর্ণসংখ্যার টাইপ মোড়কে শূন্যের কাছাকাছি তৈরি করতে পরিচালনা করেন তবে এটি শূন্য নয়। স্বাক্ষরবিহীন 32-বিট প্রকারের জন্য, এটি কেবল 4G দূরে, যা "বিলিয়ন কোটি রেকর্ড" দিয়ে বিরক্তিকরভাবে কাছে ...
ডোনাল ফেলো

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

1

কীগুলি হিসাবে স্ট্রিংগুলি ব্যবহার করে বেশ কয়েকটি সম্ভাব্য সমস্যা রয়েছে, বিশেষত যখন এটি এসকিএল-জাতীয় টেবিলে আসে। @ বুন্নি দ্বারা উল্লিখিত হিসাবে, আপনার টেবিলগুলির সূচীগুলি আরও বড় হতে চলেছে, তবে আমি আরও উল্লেখযোগ্যভাবে মনে করি, টেবিলের সাথে যে কোনও বিদেশী কী সম্পর্কগুলি হালকা ওজন (পূর্ণসংখ্যা) সনাক্তকারীর বিপরীতে স্ট্রিংটি ধারণ করতে উভয় টেবিলকে জড়িত করবে I । যদি আপনি দেখতে পান যে প্রথমটির উল্লেখ সহ আরও আরও সারণী রয়েছে, তবে স্ট্রিং কীগুলি আপনার ডাটাবেস জুড়ে প্রসারিত হবে।


1

এটি 'নিজের মধ্যে এবং কোনও খারাপ ধারণা নয়, এটি সাধারণত 20/20 hindsight দ্বারা একটি দুর্বল নকশা আপোস করে। অতিরিক্ত ব্যয় এবং জটিলতা বনাম স্ট্রিংয়ের নমনীয়তা এবং ব্যাপ্তি।

যদি পূর্ণসংখ্যার কাজের পরিসীমা বিজ্ঞতার কাজ করে এবং ব্যয়বহুল প্রসেসিংয়ের বেশিরভাগ অংশটি পূর্ণসংখ্যাটি কী উপস্থাপন করে তা জানতে প্রয়োজনীয় নয়, একটি ব্যবহার করুন।


0

আপনি কোনওভাবে হ্যাশটেবল থেকে ভুল ডেটা উদ্ধার করেছেন।

আপনি কি "ডেটাইম টেলিফোন" বা "ইভনিং টেলিফোন" বলতে চান?

অথবা

আপনার অর্থ 1234567 বা 1234576?

সংখ্যাগুলি মেশিনের পক্ষে যুক্তিযুক্তভাবে আরও কার্যকর , যখনই জিনিসগুলি খারাপ হয়ে যায় (এবং তারা করে), এটি আপনার এবং আমি কী ঘটেছে তা বোঝাতে এবং এই মুহুর্তে কয়েকটি বাইটের সঞ্চয়স্থান এবং কয়েকটি মাইক্রো (ন্যানো?) - সেকেন্ডে প্রক্রিয়াকরণ প্রতিটি সময় পরিষ্কার হয়ে যায় ।


1
এবং এইভাবে আপনি ম্যাজিক সংখ্যাটি উপস্থাপন করতে আপনার কোডের ধ্রুবকটির নামটি ব্যবহার করে ধ্রুবকের একটি তালিকা দিয়ে শেষ করেন ... জাভা এটিকে আরও দূরে সরিয়ে রেসকিউতে যোগ দেয় এবং আপনাকে কেবল নাম দিয়ে রেখে এবং নিয়মিত রাখে অদৃশ্য ম্যাপিং
11

-1

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


2
এই উত্তরটি এমন কিছু যুক্ত করে না যা ইতিমধ্যে অন্যান্য উত্তরে বলা হয়নি, যা এটি আরও ভাল বলে।
মার্টিজন পিটারস

-2

স্ট্রিং কীটি প্রায় 10-100 সংক্ষিপ্ত স্ট্রিং রেকর্ডগুলির সাথে অনুসন্ধানের টেবিলের দিকে আসে; সম্পর্কিত ডেটা আরও পঠনযোগ্য + যেমন ট্র্যাকিং পরিবর্তন (সংখ্যা / গাইড আইডি বনাম স্ট্রিং যেমন "প্রশাসক"); বিটিডব্লিউ, এএসপি.এনইটি সদস্যতা ডাটাবেস অ্যাসপনেটরোলে স্ট্রিং কী ব্যবহার করে।

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