এনাম ডাটা টাইপ ব্যবহার না করে নতুন ডাটাবেস টেবিল তৈরি করা কি অপচয়?


38

ধরুন আমার কাছে আমার 4 ধরণের পরিষেবা রয়েছে (সেগুলি প্রায়শই পরিবর্তিত হওয়ার সম্ভাবনা থাকে না):

  • পরীক্ষামূলক
  • নকশা
  • প্রোগ্রামিং
  • অন্যান্য

ধরুন আমার কাছে -০-80০ টি প্রকৃত পরিষেবা রয়েছে যা প্রতিটি উপরের বিভাগগুলির মধ্যে পড়ে। উদাহরণস্বরূপ, 'একটি পরিষেবা' "কৌশল এ ব্যবহার করে টেস্ট প্রোগ্রাম" হতে পারে এবং এটি "টেস্টিং" টাইপের হয়।

আমি তাদের একটি ডাটাবেসে এনকোড করতে চাই। আমি কয়েকটি বিকল্প নিয়ে এসেছি:

বিকল্প 0:

VARCHARসরাসরি স্ট্রিং হিসাবে পরিষেবা টাইপ এনকোড করতে সরাসরি ব্যবহার করুন

বিকল্প 1:

ডাটাবেস ব্যবহার করুন enum। তবে, এনুম মন্দ

বিকল্প 2:

দুটি টেবিল ব্যবহার করুন:

service_line_item (id, service_type_id INT, description VARCHAR);
service_type (id, service_type VARCHAR);

এমনকি আমি রেফারেন্সিয়াল অখণ্ডতা উপভোগ করতে পারি:

ALTER service_line_item 
    ADD FOREIGN KEY (service_type_id) REFERENCES service_type (id);

ভাল লাগছে, হ্যাঁ?

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

বিকল্প 3:

enumদুটি টেবিল ব্যবহার করবেন না , কেবল একটি পূর্ণসংখ্যা কলাম ব্যবহার করুন

service_line_item (
    id,
    service_type INT,        -- use 0, 1, 2, 3 (for service types)
    description VARCHAR
);

এটি এমন একটি 'নকল এনুম'-এর মতো, যাতে কোডের কোডগুলিতে আরও ওভারহেডের প্রয়োজন হয়, যেমন- এটি জেনে রাখা {2 == 'Programming'}এবং এটির সাথে যথাযথ আচরণ করা।

প্রশ্ন:

বর্তমানে আমি ধারণার অধীনে গাইডড অপশন 2 ব্যবহার করে এটি বাস্তবায়ন করেছি

  1. এনাম ব্যবহার করবেন না (বিকল্প 1)
  2. একটি স্প্রেডশিট হিসাবে একটি ডাটাবেস ব্যবহার এড়ানো (বিকল্প 0)

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

একটি 'অপ্রয়োজনীয় উপায়ের জন্য' আমি তাকিয়ে আছি Option 3। আইটি হালকা এবং অপারেটিংয়ের জন্য মূলত একই কোডটি তৈরি করা প্রয়োজন (সামান্য পরিবর্তন সহ জটিলতা এবং কাঠামো মূলত একই তবে একক টেবিলের সাথে)

আমি মনে করি আদর্শভাবে এটি সর্বদা অপ্রয়োজনীয় নয়, এবং উভয় বিকল্পের জন্য খুব ভাল কেস রয়েছে তবে বিকল্প বিকল্পটি কখন ব্যবহার করা উচিত এবং কখন বিকল্প 3 ব্যবহার করা উচিত সে সম্পর্কে একটি ভাল গাইডলাইন রয়েছে?

যখন মাত্র দুটি প্রকার (বাইনারি) থাকে

এই প্রশ্নের সাথে আরও কিছু যুক্ত করতে ... একই ভেন্যুতে আমার কাছে "স্ট্যান্ডার্ড" বা "ব্যতিক্রম" পরিষেবাটির একটি বাইনারি বিকল্প রয়েছে, যা পরিষেবা লাইন আইটেমটিতে প্রয়োগ করতে পারে। অপশন 3 ব্যবহার করে আমি এটি এনকোড করেছি ।

আমি কেবলমাত্র মানগুলি {"স্ট্যান্ডার্ড", "ব্যতিক্রম" hold রাখতে একটি নতুন টেবিল তৈরি না করে বেছে নিয়েছি} সুতরাং আমার কলামটি স্রেফ {0, 1 holds ধারণ করে এবং আমার কলামের নামটি কল করা হয়েছে exception, এবং আমার কোডটি অনুবাদ করছে {0, 1} => {STANDARD, EXCEPTION}(যা আমি প্রোগ্রামিং ভাষায় কনস্ট্যান্ট হিসাবে এনকোড করেছি) থেকে

এখন পর্যন্ত সেভাবে পছন্দ না করা ..... (বিকল্প 2 বা বিকল্প 3 পছন্দ নয়)। আমি বিকল্পটি 3 এর চেয়ে 3 টির চেয়ে বেশি দেখতে পেয়েছি তবে আরও ওভারহেডের সাথে এবং এখনও 2 এবং 3 এর মধ্যে আমি কোন বিকল্প ব্যবহার করি না কেন আমি পূর্ণসংখ্যা হিসাবে জিনিসগুলি এনকোডিং থেকে বাঁচতে পারি না।

ORM

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

প্রকৃত স্প্রেডশীট থেকে বিদ্যমান তালিকা ছিল বলে আমি প্রথমে service_typeগুলি এবং তারপর service_line_itemগুলি তৈরি করেছি। সুতরাং 'স্ট্যান্ডার্ড / ব্যতিক্রম' এবং 'টেস্টিং' এর মতো জিনিসগুলি স্প্রেডশিটে সমস্ত স্ট্রিং এবং ডিবিতে সংরক্ষণের আগে সেগুলি যথাযথ ধরণের এনকোড করতে হবে।

আমি এই উত্তরটি পেয়েছি: আপনি মতবাদ 2 এ ENUM এর পরিবর্তে কী ব্যবহার করবেন? যা ডিবি'র এনাম কনস্ট্রাক্ট ব্যবহার না করার জন্য, তবে একটি INTক্ষেত্র ব্যবহার এবং প্রোগ্রামিং ভাষার 'কনস্ট' কনস্ট্রাক্ট ব্যবহার করে ধরণের এনকোড করার পরামর্শ দেয়।

তবে উপরের এসও প্রশ্নের মধ্যে উল্লেখ করা হিসাবে, আমি সরাসরি সংখ্যার ব্যবহার এড়াতে পারি এবং ভাষা নির্মান - ধ্রুবকগুলি একবার ব্যবহার করার পরে তা সংজ্ঞায়িত করতে পারি ....

তবুও .... আপনি এটি কীভাবে ঘুরিয়ে দিন তা বিবেচনা না করেই, যদি আমি stringকোনও প্রকার হিসাবে শুরু করি তবে আমাকে প্রথমে এটি একটি যথাযথ ধরণের রূপান্তর করতে হবে, এমনকি কোনও ওআরএম ব্যবহার করার পরেও।

সুতরাং যদি বলি $str = 'Testing';, আমার এখনও এমন একটি ব্লক থাকা দরকার যা এরকম কিছু করে:

switch($str):
{ 
    case 'Testing':  $type = MyEntity::TESTING; break;
    case 'Other':    $type = MyEntity::OTHER; break;
}

ভাল কথা হ'ল আপনি পূর্ণসংখ্যা / যাদুসংখ্যার সাথে ডিল করছেন না [পরিবর্তে, এনকোডেড ধ্রুব পরিমাণের সাথে ডিল করছেন], তবে খারাপ জিনিসটি হ'ল আপনি এই রূপান্তর পদক্ষেপ ছাড়াই স্বয়ংক্রিয়ভাবে যাতায়াত করে ডেটাবেজের বাইরে এবং টানতে পারবেন না, আমার কাছে জ্ঞান.

এবং "আমি এখনও জিনিসগুলিকে এনকোড করতে এবং পূর্ণসংখ্যার সাথে ডিল করতে হবে" এই জাতীয় কথা বলে আমি আংশিক বলেছিলাম। (মঞ্জুর, এখন, ওক্রামিয়াসের মন্তব্যের পরে, আমাকে সরাসরি পূর্ণসংখ্যার সাথে ডিল করতে হবে না, তবে নামকরণের ধ্রুবকগুলি এবং প্রয়োজন অনুসারে ধ্রুবকগুলিতে / থেকে কিছু রূপান্তর নিয়ে ডিল করতে হবে)।


9
আপনি যা করেন না কেন, # 3 করবেন না। এটি বজায় রাখা সাইকোপ্যাথকে এই ম্যাজিক সংখ্যার অর্থ কী তা ক্রমাগত খুঁজে বের করতে হবে। আপনি যদি এটি করেন তবে আপনি আরও ভাল আশা করেন যে তারা কোথায় থাকেন আপনি জানেন না। blog.codinghorror.com/coding-for-violent-psychopaths
RubberDuck

7
আমি অপশনটি 2 পছন্দ করি you তবে হ্যাঁ, অনুসন্ধানের টেবিল তৈরি করা এটির "মানক" উপায়, কারণ এটি আপনাকে মজাদার জিনিসগুলি সহজেই ইউআইতে একটি ড্রপডাউন পপুলেট করার মতো মঞ্জুরি দেয়।
রবার্ট হার্ভে

আপনার পোস্টগুলিতে এখানে "সম্পাদনা" ব্যবহার করবেন না; আমরা কোন ফোরাম নই। প্রতিটি স্ট্যাক এক্সচেঞ্জ পোস্টটিতে ইতিমধ্যে একটি বিশদ সম্পাদনার ইতিহাস রয়েছে যা যে কেউ দেখতে পাবে।
রবার্ট হার্ভে

আমি যদি EDIT ব্যবহার করতে না পারি তবে আমি কী ব্যবহার করব?
ডেনিস

পোস্টটি সম্পাদনা করুন এবং এটিকে প্রাকৃতিক দেখায় যেমন আমি ইতিমধ্যে করেছি। পরিবর্তনগুলি পর্যালোচনা করতে সম্পাদনা ইতিহাস দেখুন ।
রবার্ট হার্ভে

উত্তর:


35

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

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

আপনি বর্ণিত সমস্ত অন্যান্য বিকল্পগুলি মাইএসকিউএল সহ অ্যাডহক এবং হ্যাকি enumকারণ এটি এসকিউএল স্ট্যান্ডার্ডের অংশ নয়। (এগুলি ব্যতীত, enumমাইএসকিউএল এর বাস্তবায়ন হ'ল মাইএসকিউএল এর বাস্তবায়ন, ধারণাটি নিজেই নয় standard একদিন এটি স্ট্যান্ডার্ডের অংশ হিসাবে দেখলে আমার আপত্তি হবে না))

আপনার চূড়ান্ত বিকল্প # 3 একটি সমতল পূর্ণসংখ্যার ব্যবহারের সাথে বিশেষত হ্যাকি। আপনি সমস্ত বিশ্বের সবচেয়ে খারাপ পেতে পারেন: কোনও রেফারেনশিয়াল অখণ্ডতা, কোনও নামকৃত মান, কোনও মান কী বলে তার ডাটাবেসের মধ্যে কোনও নির্দিষ্ট জ্ঞান নেই, কেবল নির্বিচারে পূর্ণসংখ্যার স্থান জুড়ে ফেলে দেওয়া হয়। এই টোকেন দ্বারা, আপনি পাশাপাশি আপনার কোডে ধ্রুবক ব্যবহার করা ছেড়ে দিতে পারেন এবং পরিবর্তে হার্ড-কোডিং মান ব্যবহার শুরু করতে পারেন। circumference = radius * 6.28318530718;। কীভাবে?

আমার মনে হয় আপনি কেন রেফারেন্স সারণীগুলি অতিমাত্রায় খুঁজে পান তা আপনার পুনরায় পরীক্ষা করা উচিত। আমি যতদূর জানি অন্য কেউ এগুলিকে কঠোর মনে করে না। আপনি কি কাজের সঠিক সরঞ্জাম ব্যবহার করছেন না বলেই তা হতে পারে?

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

অবশেষে, আপনি যদি সরাসরি ডাটাবেসের সাথে কাজ করার সময় আপনার জীবনকে আরও সহজ করতে চান তবে কমপক্ষে দুটি জিনিস আপনি করতে পারেন যা আমি এখনই ভাবতে পারি:

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

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

অবশেষে, যখন মাত্র দুটি প্রকার থাকে, বেশিরভাগ লোকেরা কেবল একটি বুলিয়ান কলাম ব্যবহার করে। সুতরাং, সেই "স্ট্যান্ডার্ড / ব্যতিক্রম" কলামটি বুলিয়ান হিসাবে প্রয়োগ করা হবে এবং এটি "ইসেক্সেপশন" নামে পরিচিত।


3
একটি সরাইয়া হিসাবে, Postgres এছাড়াও enum ধরনের , খুব। এগুলি সহজ এবং বিশেষ কিছুই নয়, আপনাকে মান হিসাবে পাঠযোগ্য স্ট্রিং ব্যবহার করার অনুমতি দেয় তবে হুডের নিচে আরও দক্ষ পূর্ণসংখ্যার ব্যবহার করতে হবে।
কাট

ক্ষেত্রে কী হবে যখন তথ্যগুলি ফলস্বরূপ পুনরাবৃত্তি করা হয়, কিন্তু অতিরিক্ত কাজ হয় না (উদাহরণস্বরূপ আপডেট / সন্নিবেশ / মোছার ব্যতিক্রমী ফলাফল হয় না)? উদাহরণস্বরূপ, কোনও ব্যক্তির লিঙ্গ (নতুন ডেটা ধরণের প্রবর্তন অসম্ভব, লিঙ্গের নাম ইত্যাদির প্রয়োজন হবে না ইত্যাদি)
অ্যাডাম থম্পসন

এটি: কারণ শেষ পর্যন্ত আপনি খুঁজে পাবেন আপনার একটি "গ্রহণযোগ্যতা পরিবেশ" দরকার এবং আপনার পরিবর্তিত এনামগুলিকে পরিবর্তন করা দরকার।
পিটার বি

3

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


0

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

আপনার ব্যবহারকারীরা তাদের নিজস্ব ভাষায় আপনার চারটি বিভাগ দেখতে পাচ্ছেন , তবে আপনার ডাটাবেস সারণিতে এখনও এমন মান রয়েছে যা আপনি পড়তে পারেন - এবং এর কোনওটিরই কোনও ডাটাবেস কাঠামো বা কোড পরিবর্তন প্রয়োজন না!

table service_type 
( id VARCHAR 
, name VARCHAR 
  primary key ( id ) 
);
table service_line_item 
( id 
, service_type VARCHAR 
, description VARCHAR
  foreign key ( service_type ) references service_type ( id )
);

select * from service_type ; 

+-------------+----------------+
| id          | name           |
+-------------+----------------+
| Testing     | Testen         |
| Design      | Design         | 
| Programming | Programmierung |
| Other       | Andere         |
+-------------+----------------+

বা, আপনার ফরাসি গ্রাহকদের জন্য ...

update services_types set name = 'Essai'         where id = 'Testing'; 
update services_types set name = 'Conception'    where id = 'Design'; 
update services_types set name = 'Programmation' where id = 'Programming'; 
update services_types set name = 'Autre'         where id = 'Other'; 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.