আমি একটি সাধারণ ব্যাংক ডাটাবেসের জন্য স্কিমা লিখছি। এখানে মূল বৈশিষ্ট্যগুলি রয়েছে:
- ডাটাবেস কোনও ব্যবহারকারীর এবং মুদ্রার বিপরীতে লেনদেন সংরক্ষণ করবে।
- প্রতিটি ব্যবহারকারীর মুদ্রায় প্রতি ব্যালেন্স থাকে, সুতরাং প্রতিটি ব্যালেন্স কেবলমাত্র প্রদত্ত ব্যবহারকারী এবং মুদ্রার বিপরীতে সমস্ত লেনদেনের যোগফল।
- ভারসাম্য নেতিবাচক হতে পারে না।
ব্যাংক অ্যাপ্লিকেশন কেবলমাত্র সঞ্চিত পদ্ধতির মাধ্যমে তার ডাটাবেসের সাথে যোগাযোগ করবে।
আমি আশা করি যে এই ডাটাবেসটি প্রতিদিন কয়েক লক্ষ নতুন লেনদেনের পাশাপাশি উচ্চতর মানের ক্রমে ভারসাম্য কোয়েরি গ্রহণ করবে। খুব দ্রুত ভারসাম্য বজায় রাখার জন্য আমার সেগুলি পূর্বনির্ধারিত করা দরকার। একই সময়ে, আমার গ্যারান্টি দেওয়া দরকার যে কোনও ভারসাম্য কখনও তার লেনদেনের ইতিহাসের সাথে বিরোধী হয় না।
আমার বিকল্পগুলি হ'ল:
একটি পৃথক
balances
টেবিল আছে এবং নিম্নলিখিতগুলির একটি করুন:উভয়
transactions
এবংbalances
টেবিল উভয় লেনদেন প্রয়োগ করুন ।TRANSACTION
ভারসাম্য এবং লেনদেন সবসময় সিঙ্ক থাকে তা নিশ্চিত করতে আমার সঞ্চিত পদ্ধতি স্তরটিতে যুক্তি ব্যবহার করুন। ( জ্যাক সমর্থিত ।)transactions
সারণীতে লেনদেন প্রয়োগ করুন এবং একটি ট্রিগার থাকুন যাbalances
আমার জন্য লেনদেনের পরিমাণের সাথে টেবিল আপডেট করে ।balances
টেবিলটিতে লেনদেন প্রয়োগ করুন এবং একটি ট্রিগার থাকুন যাtransactions
আমার জন্য লেনদেনের পরিমাণ সহ সারণীতে একটি নতুন এন্ট্রি যুক্ত করে ।
সঞ্চিত পদ্ধতির বাইরে কোনও পরিবর্তন আনা যায় না তা নিশ্চিত করতে আমাকে সুরক্ষা-ভিত্তিক পদ্ধতির উপর নির্ভর করতে হবে। অন্যথায়, উদাহরণস্বরূপ, কিছু প্রক্রিয়া সরাসরি
transactions
টেবিলের মধ্যে একটি লেনদেন সন্নিবেশ করতে পারে এবং স্কিমের আওতায়1.3
সম্পর্কিত ব্যালেন্স সিঙ্কের বাইরে চলে যাবে।balances
লেনদেন যথাযথভাবে একত্রিত করে এমন একটি সূচকযুক্ত দৃষ্টিভঙ্গি রাখুন । ভারসাম্য ইঞ্জিন তাদের লেনদেনের সাথে সামঞ্জস্য রাখতে গ্যারান্টিযুক্ত হয়, সুতরাং এটিকে গ্যারান্টি হিসাবে আমার সুরক্ষা ভিত্তিক পদ্ধতির উপর নির্ভর করতে হবে না। অন্যদিকে, আমি ভারসাম্যগুলি আর-অ-নেতিবাচক হতে পারি না, যেহেতু দর্শনগুলি - এমনকি সূচিযুক্ত দর্শনগুলি -CHECK
সীমাবদ্ধতাও রাখতে পারে না । ( ডেনির সমর্থিত )transactions
এই লেনদেনটি কার্যকর হওয়ার পরে কার্যকর ভারসাম্য রক্ষার জন্য কেবল একটি টেবিল আছে তবে অতিরিক্ত কলাম সহ। সুতরাং, ব্যবহারকারীর জন্য সর্বশেষ লেনদেনের রেকর্ড এবং মুদ্রায় তাদের বর্তমান ব্যালেন্সও রয়েছে। ( অ্যান্ড্রু নীচে প্রস্তাবিত ; গ্যারিক দ্বারা প্রস্তাবিত বৈকল্পিক ।)
আমি যখন প্রথম এই সমস্যার সমাধান করেছি, তখন আমি এই দুটি আলোচনা পড়েছি এবং বিকল্পের বিষয়ে সিদ্ধান্ত নিয়েছি 2
। রেফারেন্সের জন্য, আপনি এটি এখানে একটি খালি-হাড় প্রয়োগ বাস্তবায়ন করতে পারেন ।
আপনি কি উচ্চ লোড প্রোফাইল দিয়ে এর মতো একটি ডেটাবেস ডিজাইন বা পরিচালনা করেছেন? আপনার এই সমস্যার সমাধান কী ছিল?
আপনি কি মনে করেন যে আমি সঠিক নকশার পছন্দটি করেছি? আমার কিছু মনে রাখা উচিত?
উদাহরণস্বরূপ, আমি জানি
transactions
টেবিলের স্কিমা পরিবর্তনগুলির জন্য আমারbalances
ভিউটি পুনর্নির্মাণের প্রয়োজন হবে । এমনকি যদি আমি ডাটাবেস ছোট রাখার জন্য লেনদেন সংরক্ষণ করি (যেমন তাদের অন্য কোথাও সরিয়ে নিয়ে সংক্ষিপ্ত লেনদেনের বদলে), প্রতিটি স্কিমা আপডেটের মাধ্যমে কয়েক মিলিয়ন লেনদেনের ভিউটি পুনর্নির্মাণ করা সম্ভবত প্রতিস্থাপনে উল্লেখযোগ্যভাবে আরও ডাউনটাইম বোঝাতে চাইবে।যদি সূচকযুক্ত দৃশ্যটি যাওয়ার উপায় হয় তবে আমি কীভাবে গ্যারান্টি দিতে পারি যে কোনও ভারসাম্য নেতিবাচক নয়?
সংরক্ষণাগার লেনদেন:
সংরক্ষণাগার লেনদেন এবং আমি উপরে উল্লিখিত "সারাংশ লেনদেনগুলি" সম্পর্কে কিছুটা বিশদভাবে বলি। প্রথমত, নিয়মিত সংরক্ষণাগারটি এই জাতীয় উচ্চ-লোড সিস্টেমে প্রয়োজনীয়তা হবে a পুরানো লেনদেন অন্য কোথাও স্থানান্তরিত করার সময় আমি ভারসাম্য এবং তাদের লেনদেনের ইতিহাসের মধ্যে ধারাবাহিকতা বজায় রাখতে চাই। এটি করার জন্য আমি আর্কাইভ লেনদেনের প্রতিটি ব্যাচ তাদের ব্যবহারকারী এবং মুদ্রার পরিমাণের সংক্ষিপ্তসার সহ প্রতিস্থাপন করব।
সুতরাং, উদাহরণস্বরূপ, লেনদেনের এই তালিকা:
user_id currency_id amount is_summary
------------------------------------------------
3 1 10.60 0
3 1 -55.00 0
3 1 -12.12 0
দূরে সংরক্ষণাগারযুক্ত এবং এটি দিয়ে প্রতিস্থাপন করা হয়:
user_id currency_id amount is_summary
------------------------------------------------
3 1 -56.52 1
এইভাবে, সংরক্ষণাগারভুক্ত লেনদেনের সাথে ভারসাম্য একটি সম্পূর্ণ এবং ধারাবাহিক লেনদেনের ইতিহাস বজায় রাখে।