একাধিক কারণে কেন একটি বড় "গড টেবিল" ব্যবহার করা খারাপ। আমি চেষ্টা করব এবং একটি উদাহরণস্বরূপ তৈরি একটি উদাহরণ ডেটাবেস দিয়ে সমস্যাগুলি বর্ণনা করব। ধরে নেওয়া যাক আপনি ক্রীড়া ইভেন্টগুলি মডেল করার চেষ্টা করছেন। আমরা বলব যে আপনি মডেল গেমস এবং দলগুলি সেই গেমগুলিতে খেলতে চান। একাধিক টেবিল সহ একটি নকশা এটি দেখতে দেখতে (এটি উদ্দেশ্যটির পক্ষে খুব সরলতর তাই আরও সাধারণীকরণ প্রয়োগ করা যেতে পারে এমন জায়গায় আটকাবেন না):
Teams
Id | Name | HomeCity
Games
Id | StartsAt | HomeTeamId | AwayTeamId | Location
এবং একটি একক টেবিল ডাটাবেস এর মত দেখতে হবে
TeamsAndGames
Id | TeamName | TeamHomeCity | GameStartsAt | GameHomeTeamId | GameAwayTeamId | Location
প্রথমে আসুন সেই টেবিলগুলিতে সূচকগুলি তৈরি করা উচিত। কোনও দলের জন্য আমার যদি হোম সিটিতে সূচকের প্রয়োজন হয় তবে আমি এটিকে Teams
টেবিল বা TeamsAndGames
টেবিলে খুব সহজেই যুক্ত করতে পারি। মনে রাখবেন যে যখনই আপনি একটি সূচক তৈরি করেন, সেটিকে অন্য কোথাও ডিস্কে সঞ্চিত করা উচিত এবং সারণীতে সারি যুক্ত করা হিসাবে আপডেট করা উচিত। Teams
টেবিলের ক্ষেত্রে এটি বেশ সোজা। আমি একটি নতুন দল রেখেছি, ডাটাবেস সূচক আপডেট করে। তবে কি জন্য TeamsAndGames
? ঠিক আছে, একই থেকে প্রযোজ্যTeams
উদাহরণ। আমি একটি দল যুক্ত করি, সূচি আপডেট হয়। তবে আমি যখন একটি গেম যুক্ত করি তখন তাও ঘটে! যদিও সেই ক্ষেত্রটি কোনও গেমের জন্য শূন্য হয়ে যাবে, তবুও সূচিটি আপডেট করতে হবে এবং যাই হোক না কেন সেই গেমটির জন্য ডিস্কে সংরক্ষণ করতে হবে। একটি সূচকের জন্য, এটি খুব খারাপ শোনাচ্ছে না। তবে যখন এই টেবিলটিতে ছড়িয়ে পড়া একাধিক সত্তার জন্য আপনার অনেক সূচকের প্রয়োজন হয়, আপনি সূচকগুলি সংরক্ষণ করে প্রচুর জায়গা নষ্ট করেন এবং যেখানে প্রযোজ্য না হয় সেগুলির জন্য আপডেট করার জন্য প্রসেসরের প্রচুর সময় ব্যয় করেন।
দ্বিতীয়ত, ডেটা ধারাবাহিকতা। দুটি পৃথক টেবিল ব্যবহার করার ক্ষেত্রে, আমি কোন দল খেলায় খেলছে তা নির্ধারণ করতে আমি টেবিল থেকে Games
টেবিলের কাছে বিদেশী কী ব্যবহার Teams
করতে পারি। এবং ধরে নিলাম যে আমি HomeTeamId
এবং AwayTeamId
কলামগুলি বাতিল নয়, ডাটাবেসটি নিশ্চিত করবে যে আমি যে খেলাগুলি রেখেছি সেগুলিতে 2 টি দল রয়েছে এবং সেই দলগুলি আমার ডেটাবেজে উপস্থিত রয়েছে। তবে একক টেবিলের দৃশ্যের কী হবে? ঠিক আছে, যেহেতু এই টেবিলটিতে একাধিক সত্ত্বা রয়েছে, সেই কলামগুলি অবিচ্ছিন্ন হওয়া উচিত (আপনি এগুলিকে আবশ্যক নয় এবং সেখানে আবর্জনার ডেটা সরিয়ে ফেলতে পারেন, তবে এটি কেবল একটি ভয়ঙ্কর ধারণা)। যদি এই কলামগুলি অবিস্মরণযোগ্য হয় তবে ডাটাবেসটি আর গ্যারান্টি দিতে পারে না আপনি যখন কোনও গেম সন্নিবেশ করান যে এটিতে দুটি দল রয়েছে।
তবে আপনি যদি যাইহোক এটির জন্য যাবেন ঠিক করেন? আপনি বিদেশী কীগুলি সেট আপ করেছেন যাতে সেই ক্ষেত্রগুলি একই টেবিলের অন্য সত্তার দিকে নির্দেশ করে। তবে এখন ডাটাবেসগুলি কেবল সুনির্দিষ্টভাবে নিশ্চিত করবে যে সেই সত্তাগুলি সারণীতে উপস্থিত রয়েছে, তারা সঠিক ধরণের নয়। আপনি খুব সহজেই GameHomeTeamId
অন্য একটি গেমের আইডিতে সেট করতে পারেন এবং ডাটাবেসটি মোটেই অভিযোগ করবে না। আপনি যদি একাধিক টেবিলের দৃশ্যে এটি চেষ্টা করে থাকেন তবে ডাটাবেসটি ফিট করে।
আপনি "ভাল, আমরা কেবল কোডের মধ্যে এটি কখনই করব না" তা নিশ্চিত করে এই সমস্যাগুলি হ্রাস করার চেষ্টা করতে পারেন। আপনি যদি প্রথমবারের মতো বাগ ফ্রি কোড লেখার ক্ষমতায় এবং ব্যবহারকারী যে-সকল চেষ্টা করতে পারে তার প্রতিটি অদ্ভুত সংমিশ্রণের বিষয়টি বিবেচনায় নেওয়ার ক্ষমতায় আপনি যদি আত্মবিশ্বাসী হন তবে ঠিক এগিয়ে যান। আমি ব্যক্তিগতভাবে সেগুলির মধ্যে যে কোনও একটির করার ক্ষমতা নিয়ে আমি আত্মবিশ্বাসী নই, তাই আমি ডেটাবেসটি আমাকে একটি অতিরিক্ত সুরক্ষা জাল দিতে দেব।
(এটি আরও খারাপ হয়ে যায় যদি আপনার নকশাটি এমন এক যেখানে আপনি বিদেশী কীগুলি ব্যবহার না করে সারিগুলির মধ্যে সমস্ত প্রাসঙ্গিক ডেটা অনুলিপি করেন। যেকোন বানান / অন্যান্য ডেটা অসঙ্গতিগুলি সমাধান করা কঠিন। "জন" যদি "জন" এর ভুল বানান হয় তবে আপনি কীভাবে বলতে পারবেন? "বা যদি এটি উদ্দেশ্যমূলক ছিল (কারণ তারা দুটি পৃথক ব্যক্তি)?)
তৃতীয়ত, প্রায় প্রতিটি কলামই নালাগুলি হওয়া দরকার বা অবশ্যই অনুলিপিযুক্ত বা আবর্জনার ডেটা দিয়ে পূরণ করতে হবে। একটি গেমের দরকার নেই TeamName
বা TeamHomeCity
। সুতরাং হয় প্রতিটি গেমের সেখানে কোনও না কোনও স্থানধারক দরকার হয় বা এটি ছোট হওয়া দরকার। এবং যদি এটি অবিস্মরণযোগ্য হয় তবে ডাটাবেসটি আনন্দের সাথে একটি গেম নেবে TeamName
। এটি কোনও নামহীন একটি দলও নেবে, এমনকি যদি আপনার ব্যবসায়িক যুক্তিটি এমনটি না ঘটে তবেও।
আপনি আলাদা আলাদা টেবিল (বিকাশকারী তাত্পর্য সংরক্ষণ সহ) কেন চাইবেন তার কয়েকটি অন্যান্য কারণ রয়েছে। বৃহত্তর টেবিলটি আরও ভাল হতে পারে এমন কয়েকটি কারণও রয়েছে (ডেনরমালাইজেশন কখনও কখনও কর্মক্ষমতা উন্নত করে)। এই পরিস্থিতিগুলি খুব কম এবং এর মধ্যে (এবং সাধারণত যখন আপনি পারফরম্যান্স মেট্রিকগুলি দেখান যে এটি আসলেই সমস্যা, কোনও অনুপস্থিত সূচক বা অন্য কিছু নয়) এর মাধ্যমে পরিচালনা করা যায় best
শেষ অবধি, এমন কিছু বিকাশ করুন যা বজায় রাখা সহজ হবে। এটি "কাজ করে" এর অর্থ এটি ঠিক আছে। গড টেবিলগুলি বজায় রাখার চেষ্টা করা (godশ্বরের ক্লাসগুলির মতো) একটি দুঃস্বপ্ন। আপনি পরে ব্যথার জন্য নিজেকে প্রস্তুত করছেন।