ধরুন আমার কাছে আমার 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)
- একটি স্প্রেডশিট হিসাবে একটি ডাটাবেস ব্যবহার এড়ানো (বিকল্প 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;
}
ভাল কথা হ'ল আপনি পূর্ণসংখ্যা / যাদুসংখ্যার সাথে ডিল করছেন না [পরিবর্তে, এনকোডেড ধ্রুব পরিমাণের সাথে ডিল করছেন], তবে খারাপ জিনিসটি হ'ল আপনি এই রূপান্তর পদক্ষেপ ছাড়াই স্বয়ংক্রিয়ভাবে যাতায়াত করে ডেটাবেজের বাইরে এবং টানতে পারবেন না, আমার কাছে জ্ঞান.
এবং "আমি এখনও জিনিসগুলিকে এনকোড করতে এবং পূর্ণসংখ্যার সাথে ডিল করতে হবে" এই জাতীয় কথা বলে আমি আংশিক বলেছিলাম। (মঞ্জুর, এখন, ওক্রামিয়াসের মন্তব্যের পরে, আমাকে সরাসরি পূর্ণসংখ্যার সাথে ডিল করতে হবে না, তবে নামকরণের ধ্রুবকগুলি এবং প্রয়োজন অনুসারে ধ্রুবকগুলিতে / থেকে কিছু রূপান্তর নিয়ে ডিল করতে হবে)।