এনাম এবং একটি টেবিল সিঙ্কে রাখা


11

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

  অবস্থা
  আইডি বর্ণনা
  --------------
   0 প্রক্রিয়াজাত
   1 টি বিচারাধীন
   2 প্রক্রিয়াজাত
   3 ত্রুটি

আমার প্রোগ্রামে আমাকে অন্য টেবিলের জন্য একটি স্থিতি আইডির নির্ধারণ করতে হবে, বা নতুন স্ট্যাটাস আইডির সাথে সম্ভবত কোনও রেকর্ড আপডেট করতে হবে।

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

এই দুটি, এনাম এবং টেবিল সিঙ্ক করে রাখার সঠিক পদ্ধতির কী হবে?


আপনি কেন জিনিসগুলিকে সিঙ্কে রাখছেন এবং সিঙ্কে রাখছেন না? সিঙ্ক (এটি বলুন) অদ্ভুত!
মিঃফক্স

1
@ সুস্লিক তারা উভয়ই একইরূপে উচ্চারিত হয়েছে। মেলানোর এবং সিঙ্ক
এমপিলেটিয়ার

1
একটি এনাম এবং ডাটাবেস সারণি হ'ল সদৃশ। অন্যান্য অ্যাপ্লিকেশন দ্বারা ডাটাবেস টেবিলটি ব্যবহার না করা হলে আমি টেবিলটি পূর্ববর্তী করে কেবল এনাম ব্যবহার করব। যদি টেবিলটি একাধিক অ্যাপ্লিকেশনে ব্যবহৃত হবে, পরিবর্তে রানটাইমে ডাটাবেস থেকে স্ট্যাটাসগুলি লোড করুন।
পিটার স্মিথ

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

@ পিটারস্মিথ ডাটাবেসগুলি যদি কেবল আপনার জাভা এনামে থাকে এবং কোনও সারণীতে না থাকে তবে সীমাবদ্ধতাগুলি প্রয়োগ করতে পারে না। আপনি আপনার ডাটাবেসে মান সীমাবদ্ধ করতে চলেছেন, আপনি না?
ডেভিড কনরাড

উত্তর:


5

আমি আপনার প্রোগ্রামের এনামগুলিকে কঠোর কোড করব, কারণ আমি সন্দেহ করি যে এই বিভিন্ন স্ট্যাটাসগুলি আপনার প্রোগ্রামের যুক্তিকে প্রভাবিত করে। আপনার যদি একটি নতুন স্ট্যাটাস থাকে, আপনার প্রোগ্রামটি এই নতুন স্থিতিতে কীভাবে প্রতিক্রিয়া প্রকাশ করবে?

ডাটাবেস আপনার আবেদনের অংশ হিসাবে, আমি মনে করি না যে এটির সাথে কথা বলার জন্য, অন্যের সাথে পরামর্শ না করে কোনওটিকে প্রভাবিত করা বুদ্ধিমান হবে।


এটি নতুন স্ট্যাটাসগুলি সম্পর্কে খুব বেশি নয় (যা অবশ্যই ডেটাবেস এবং প্রোগ্রাম উভয়েরই পরিবর্তনের নিশ্চয়তা দেয়), তবে আইডি মানগুলি।
এমপিলেটিয়ার

2
আমি দেখতে পাচ্ছি না আপনি কেন আইডিটির মান পরিবর্তন না করে পরিবর্তন করবেন। এই ধরণের গণনাটি স্বয়ং-বর্ধিত হবে না এবং এগুলি কেবলমাত্র ডেটাবেস ডিবাগ করা লোকদের জন্য পঠনযোগ্যতার জন্য, সাধারণত আপনার অ্যাপ্লিকেশনটি কোয়েরি করবে এবং এটি ইতিমধ্যে জানতে পারে যে আইডিটি কী pendingহবে। অবশ্যই একটি Statusটেবিল থাকা আপনাকে রেফারেন্সিয়াল অখণ্ডতা দেয় তবে এটি যে বিন্দুটি আমি তৈরি করতে চাইছি সেটি সেটাই নির্দেশ করে।
ম্যাথু

আচ্ছা হ্যাঁ, এটি ধারণা। কিন্তু যদি আমি অন্যদের এক জায়গায় একটি থেকে আইডি এর সেট, আমি বন্ধ কাজ করছি ধৃষ্টতা তারা উভয় ঠিক। এটি একটি আলগা লিঙ্ক, না?
এমপিলেটিয়ার

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

8

আমি অ্যাপ্লিকেশন শুরু হওয়ার সাথে সাথে এই তথ্যটি সাধারণত একটি স্ট্যাটিক ক্যাশে (সাধারণত একটি হ্যাশম্যাপে বা এরকম কিছুতে) লোড করব। এটি পুনরায় কম্পাইল করা এড়ানো যায় কারণ কেবল এনাম কোনওভাবে পরিবর্তিত হয়েছিল।


2

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

উদাহরণস্বরূপ কোনও প্রতিবেদন টানতে আপনার ক্ষেত্রে ডিবিতে তাদের সঠিক বর্ণনা সহ সেই স্থিতির মানগুলি থাকা উচিত।

সাধারণত আমার কাছে একটি ছোট কোড স্নিপেট থাকে যা ডিবিতে সংযোগ স্থাপন করবে এবং যাচাই করবে যে একটি নির্দিষ্ট সারণীতে তালিকাভুক্ত স্ট্যাটাসগুলির সকলের একই আইডি / নাম মান রয়েছে যা আমি মেমরিতে হার্ড-কোডড করেছি। যদি তারা মেলে না তবে আমি সফ্টওয়্যারটির কার্যকারিতা বাতিল করব।

আপনার প্রয়োজনের উপর নির্ভর করে আপনি কিছুটা ভিন্ন আচরণ বাস্তবায়ন করতে চাইতে পারেন তবে সামগ্রিকভাবে যে কোনও অবস্থাতেই হার্ড-কোডেড হওয়া ভাল ধারণা।


2

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

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

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


আপনি একটি এনামের রেফারেন্সগুলি কীভাবে মুছে ফেলবেন? উদাহরণস্বরূপ আপনি এই ক্ষেত্রে কোনও স্থিতি অনুসারে বাছাই করছেন বা অনুসন্ধান করছেন। ডিবিতে কিছু ম্যাজিক মান থাকা আমার সাথেও ভাল বসে না। তাত্ক্ষণিক টেবিলগুলি এটাই।
nportelli

অতীতে, আমি এর বিপরীতে করেছি। যখনই অ্যাপ্লিকেশন বুটে এনামে কোড পরিবর্তন হয়, এটি সেই মানগুলি ডাটাবেসে সিঙ্ক করে s এখানে কোড সত্যের উত্স। ডেটাবেস এটির একটি উপস্থাপনা। সাধারণত আমি ডিবিতে মানগুলি অগ্রাহ্য করি যা কোডটি বুঝতে পারে না তবে এইভাবে, প্রয়োজনে স্বয়ংক্রিয়ভাবে ডিবি সাফ করার একটি প্রক্রিয়া পাই।
আনশুল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.