ডেটাবেস ডিজাইন - স্টোর স্টেট বা প্রতিবার গণনা রাষ্ট্র?


17

ধরা যাক আমার কাছে একটি সম্পর্কিত ডেটাবেস অ্যাপ্লিকেশন এবং একটি "ব্যবহারকারী" অবজেক্ট এবং একটি "বার্তা" অবজেক্ট রয়েছে। এখন আমি এই ব্যবহারকারীর কাছে অপঠিত বার্তাগুলির সংখ্যাটি প্রদর্শন করতে চাই।

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

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

এটি সাধারণত কীভাবে হয় বা এর থেকে আরও ভাল পদ্ধতির কী হয়?


1
বিভিন্ন কারণের উপর নির্ভর করে: আপনার ডিবি বিভাজন হয়েছে? আপনি কত সারি / ব্যবহারকারীর প্রত্যাশা করছেন? আপনি কোন আকারের মোট ডিবি আশা করছেন (বা মোট কতজন ব্যবহারকারী)? আপনি প্রতি সেকেন্ডে কতগুলি অনুরোধের প্রত্যাশা করছেন? এই সমস্ত কিছুই সঠিক হতে হবে না, তবে কিছু রুক্ষ ধারণা ...
ওমর ইকবাল

10
+1 এটি একটি ক্লাসিক সম্পর্কিত সম্পর্কিত ডাটাবেস প্রশ্ন। স্বাভাবিক করতে, না স্বাভাবিক করতে? ওটাই হচ্ছে প্রশ্ন. লজ্জাজনক ডুপ্লিকেশনটির স্লাইং এবং তীরগুলি সহ্য করার জন্য, বা ট্রিগারগুলি গ্রহণ করার মাধ্যমে এবং চাকরীর মাধ্যমে, তাদের কি শেষ করার জন্য এই স্কিমায় আভিজাত্য আছে কিনা?
রস প্যাটারসন

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

উত্তর:


14

এটি সাধারণত কীভাবে করা হয় বা এর থেকে আরও ভাল পদ্ধতির কী হয়?

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


2
সর্বোত্তম পন্থা হ'ল (প্রথমে সহজ পদ্ধতির সাথে যান)। সাধারণ নিয়মগুলি নির্দিষ্টকরণের চেয়ে আরও ভাল f (যদিও "পরীক্ষার জন্য +1!")
ডগএম

9

ডাটাবেস তত্ত্ব অনুসারে পাঠ্যপুস্তকের সমাধানটি আপনার ডাটাবেসে কোনও মান থাকতে হবে না যা অন্যান্য ডেটার মানগুলির উপর নির্ভর করে, কারণ এগুলি ট্রানজিটিভ নির্ভরতা । অন্যান্য ক্ষেত্রগুলির উপর ভিত্তি করে গণনা করা মানগুলি এমন ক্ষেত্রগুলি রাখা সাধারণীকরণের লঙ্ঘন, কারণ এটি অনর্থক তথ্যের দিকে পরিচালিত করে।

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


4
ধারাবাহিকতার সমস্যাটি ট্রিগারগুলির সাথে চাটাই করা সহজ যা কাউন্টারের উপর INSERTবা সামঞ্জস্য করে DELETE। (বা UPDATEকোনও বার্তার মালিকের পরিবর্তনের জন্য অ্যাকাউন্ট নেওয়া))। একটি ভাল ডিবিএমএস অপারেশন করবে এবং একই লেনদেনে ট্রিগারগুলি চালাবে, সুতরাং এটির সমস্ত কিছুই হয় না none
blrfl

4

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

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

আইসিআরডকে পতাকাঙ্কিত করার জন্য প্রতি বার্তায় কোনও বার্তা পড়লে ডিবিতে ভ্রমণ করা যায়? ক্ষেত্রটি অন্য ক্ষেত্রের পুনঃ গণনা ছাড়াই যথেষ্ট।

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


গণনা ক্ষেত্রগুলি আপ টু ডেট রাখার সাথে পারফরম্যান্স সংক্রান্ত সমস্যার উল্লেখ করার জন্য +1
উইঙ্কব্র্যাস

0

আমি যেভাবে এটি করব তা হ'ল প্রতিবার একটি ক্যোয়ারী চালিয়ে যাওয়া, অর্থাৎ আপনার দ্বিতীয় পদ্ধতি। আপনার ক্যোয়ারের কার্যকারিতা উন্নত করতে ব্যবহারকারীদের টেবিলে বিদেশী কী হিসাবে কাজ করে এমন কলামে আপনার বার্তা সারণিতে আপনি একটি সূচি যুক্ত করেছেন তা নিশ্চিত করুন।

তারপরে ডক যেমন বলেছে, এই পদ্ধতির পারফরম্যান্সটি পরিমাপ করুন এবং তারপরে আপনাকে আলাদা পথের প্রয়োজন কিনা তা আপনি বলতে সক্ষম হবেন।

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