একক টেবিল ডাব্লু / অতিরিক্ত কলাম বনাম একাধিক টেবিল যা স্কিমাটিকে নকল করে


13

আমি এমন একটি প্রকল্পে কাজ করছি যেখানে এক পর্যায়ে, আমার ডাটাবেসটিতে আমার একাধিক কলামযুক্ত একক টেবিল থাকা উচিত যা প্রতি রেকর্ড ব্যবহার করে না, বা সদৃশ স্কিমাযুক্ত একাধিক টেবিল রয়েছে।

আমি একটি ক্রীড়া তথ্য অ্যাপ্লিকেশন তৈরি করছি যা একাধিক ক্রীড়া পরিচালনা করতে পারে। উদাহরণস্বরূপ আমরা এনবিএ, এনএইচএল, এমএলবি, এনএফএল পরিচালনা করতে পারি। প্রতিটি খেলাধুলায় খুব অনুরূপ ধারণা রয়েছে - টিমস, সূচি, ইনজুরি, প্লেয়ারের তথ্য ..

আমাদের ডেটা উত্স অবশ্যই আমাদের একই স্কিমায় প্রতিটি টুকরো ডেটা দেয় না। প্রতিটি স্পোর্টের আলাদা স্কিমা থাকে যা আমরা আমাদের বিক্রেতার কাছ থেকে ডেটা পাই।

সাধারণতা নির্ধারণের জন্য ডেটা ফিডগুলির বিশদ বিশ্লেষণ করার জন্য পর্যাপ্ত সময় (ক্লায়েন্টের চাহিদা) না থাকায় আমি আমার বাজিটি হেজড করে 'নিরাপদ বাজি' নিয়েছি এবং প্রতিটি খেলার জন্য পৃথক পৃথক টেবিল তৈরি করেছি যার পরিবর্তে সমস্ত টেবিল রয়েছে খেলাধুলা

ফলাফলটি বেশ কয়েকটি টেবিলের নকল করা স্কিমা এবং সেই সাথে ডাটাবেজে (যেমন সঞ্চিত প্রকোস) ডুপ্লিকেট করা ইন্টারফেস। আমার কাছে এনবিএ_গেম, এনএফএল_গেম, এনবিএ_ডিয়াম, এনএফএল_দেহ ইত্যাদির মতো কিছু রয়েছে। প্রতিটি টেবিলের কয়েকটি বৈশিষ্ট্য থাকতে পারে যা অন্যটি না করে এবং বেশ কয়েকটি ভাগ করে নেওয়া হয়। এটি 4 বা 5 খেলা জুড়ে 5-10 টেবিল বলার জন্য যায়। আমি এখনও নিশ্চিত নই যে এটি সম্পূর্ণ খারাপ জিনিস কিনা - বিকল্প, একক টেবিলের এমন বৈশিষ্ট্য রয়েছে যার মধ্যে এমন বৈশিষ্ট্য রয়েছে যা সমস্ত খেলাধুলা ব্যবহার করে না, তার নিজেরও অযৌক্তিক হতে পারে।

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

অতীতে বিকল্প ব্যবহারের মতো টেবিল উত্তরাধিকারের মতো কিছু বিকল্প আছে যা আরও ভাল কাজ করেছে?

ধন্যবাদ

উত্তর:


12

শেষ পর্যন্ত, এটি ব্যবহার এবং আর্কিটেকচারে নেমে আসে।

স্থাপত্য

সিস্টেমটি "কোনও খেলাধুলা" পরিচালনা করে? আপনি যে ধারণাটি আপনার আর্কিটেকচার নভোচারী টুপিটি রেখেছেন এবং এমন একটি জেনেরিক সিস্টেম তৈরি করেছেন যা ভবিষ্যতের যে কোনও ধরণের খেলাধুলা পরিচালনা করতে পারে যা আজ অবধি নেই?

যদি তা হয় তবে স্পষ্টতই গতিশীল-নামযুক্ত টেবিলগুলি থাকা একটি বিশাল ব্যথা, সুতরাং প্রয়োজনে এন স্পোর্টসকে সমর্থন করে এমন একটি স্কিমা থাকা বোধগম্য হবে।

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

আপনি একাধিক খেলা খেলতে এমন খেলোয়াড়দের কীভাবে পরিচালনা করবেন? তারা কি দুটি এন্ট্রি পেয়েছে (যেমন, আপনি আলাদা লোক হিসাবে বিবেচনা করেন) বা আপনি তাদের সাথে নির্দিষ্ট কিছু করার চেষ্টা করছেন?

ব্যবহার

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

এমন কি এমন কোনও সময় রয়েছে যেখানে আপনি এক সাথে একাধিক খেলাধুলার খেলোয়াড় (বা আপনি উল্লিখিত অন্য কোনও বিষয়) প্রদর্শন করছেন?

আমি এটি কোনও অনুসন্ধান ফাংশনটির জন্য দেখতে পেলাম, যেখানে আপনি খেলোয়াড় বা দলের নাম (খেলাধূলা নির্বিশেষে) অনুসন্ধান করতে পারেন তবে এর বাইরে আমি অনেকগুলি ব্যবহারের ক্ষেত্রে কল্পনা করতে পারি না।

আপনার যদি কখনও এটি করার প্রয়োজন হয় না, তবে আপনার পদ্ধতির বিষয়টি পুরোপুরি ঠিক। আপনি এখানে পড়া বন্ধ করতে পারেন।

বিকল্প স্কিমাস

দেখেছে

আমি KISS এর ভক্ত। 15+ বছরের সফ্টওয়্যার বিকাশে, আমি "দর্শনের সবচেয়ে সহজ জিনিসটি তৈরি করে" দর্শনে ফিরে যেতে থাকি।

সুতরাং ক্রস-স্পোর্ট অনুসন্ধানের ক্রিয়াকলাপটি সত্যই একমাত্র ব্যবহারের ক্ষেত্র হিসাবে ধরে নিয়ে আমার প্রাথমিক প্রতিক্রিয়াটি হল ভিউ তৈরি করা:

SELECT PlayerName, 'NFL' as [Sport], TeamName FROM NFL_Players JOIN NFL_Teams ... 
UNION  
SELECT PlayerName, 'NHL' as [Sport], TeamName FROM NHL_Players JOIN NHL_Teams ... 
UNION ....

অবশ্যই, আপনি যদি নতুন খেলা যোগ করেন তবে আপনাকে ভিউতে যুক্ত করতে হবে। অন্যান্য সাধারণ তথ্য অন্তর্ভুক্ত করার জন্য এটি দরকারী হতে পারে তবে এটি কী দেখানোর দরকার তার উপর নির্ভরশীল।

তাই সার্চ কোড (ব্যতীত হয়তো কিভাবে লিংক করতে বুদ্ধিমান বেশি বা কোন নির্দিষ্ট কোড আছে করার দরকার নেই আমি দেখুন সংজ্ঞা সমস্ত খেলাধুলা-নির্দিষ্ট কাপড় রাখার চেষ্টা করতাম /nhl/players/player-nameবনাম /nfl/...বা তবে আপনার অ্যাপ্লিকেশান না)।

টেবিল উত্তরাধিকার

সারণির উত্তরাধিকার কাজ করতে পারে তবে এটি বেশ জটিল। আমার এটির সাথে এক টন অভিজ্ঞতা নেই এবং প্রকৃতপক্ষে, আমি মনে করি প্রতিবারই এটির মূল্যায়নের সাথে আমি জড়িত হয়েছি আমরা সহজ কিছু করে শেষ করেছি (যেমন আমি এখানে পরামর্শ দিচ্ছি)।

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

ক্রীড়া-নির্দিষ্ট বৈশিষ্ট্যের জন্য আলাদা সারণী

আপনি একটি একক playersটেবিল করতে পারেন যা সমস্ত স্পোর্টসের সমস্ত খেলোয়াড়ের জন্য সাধারণ বৈশিষ্ট্যযুক্ত রয়েছে এবং তারপরে nhl_players_detailsপ্লেয়ারআইডি এবং প্লেয়ারের অতিরিক্ত তথ্যের সাথে কলামগুলিতে থাকা সারণীর মতো অন্য সেট রয়েছে। যদি এখানে প্রচুর পরিমাণে সাধারণ গুণাবলী থাকে বা আপনার কাছে "সমস্ত ক্রীড়া থেকে সমস্ত খেলোয়াড়" ব্যবহার করে থাকে তবে এটি উপলব্ধি করতে পারে।

ক্রীড়া-নির্দিষ্ট বৈশিষ্ট্যের জন্য মূল মান জোড়

সম্পূর্ণরূপে বিকল্প পদ্ধতিতে: একটি আছে playersসারণী (আবার, নামের মত সাধারণ গুনাবলী সহ) এবং তারপর একটি player_dataআছে টেবিল PlayerId, Sport, Attribute, Value। প্রবেশ করানো বৈশিষ্ট্যের নামগুলি খেলাধুলার নির্দিষ্ট হবে। এটি আপনাকে স্কিমা পরিবর্তন না করে প্রয়োজনীয়ভাবে নতুন বৈশিষ্ট্য যুক্ত করতে দেয় (আপনার কোডটি অবশ্যই তাদের লোড / ডিসপ্লে করতে অবশ্যই জানতে হবে)। অপূর্ণতা হ'ল আপনি কিছুটা নিখুঁততা হারাবেন: মানটি সাধারণত স্ট্রিংয়ের ক্ষেত্র হয়, সুতরাং আপনার অ্যাপ্লিকেশন কোডটি দৃili়রোগী হতে হবে এবং স্ট্রিংটিকে valueএকটি নির্দিষ্ট ডেটা টাইপের (যেমন পূর্ণসংখ্যার) রূপান্তরিত করার সম্ভাব্য ব্যর্থতাগুলি পরিচালনা করতে হবে ।

এই ধারণাটি অবশ্যই টিমস, গেমস ইত্যাদিতে প্রয়োগ করতে পারে


কোনও লিগ্যাসি প্রকল্পের সমাধান অনুসন্ধানে একাধিক প্রামাণ্যযোগ্য প্রকার এবং সারণী হবে, এখানে দেখা মতামতের উল্লেখ, যা আমি ভুলে গিয়েছিলাম, আমার গবেষণার জন্য আরও একটি সম্ভাব্য সমাধান প্রস্তাব দিতে সহায়তা করেছে। ধন্যবাদ.
ফুলস্ট্যাকফুল

5

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

পৃষ্ঠতলে, আপনার উদাহরণগুলি ধারণার মতো যথেষ্ট বলে মনে হচ্ছে (এক্স_গেম বনাম Y_Game এবং X_Team বনাম Y_Team) যে কয়েকটি কলামের অতিরিক্ত ওভারহেড অযৌক্তিক বলে মনে হয় না। এটি বলেছে যে, প্রতিটি খেলা যদি টেবিলে কয়েক ডজন অতিরিক্ত কলাম যুক্ত করতে চলেছে, তবে তা সত্যই অস্বস্তিকর হবে।

সেক্ষেত্রে আপনি একটি হাইব্রিড মডেলটি বিবেচনা করতে চাইতে পারেন, যেখানে সাধারণ তথ্য কেন্দ্রীয় টেবিলে রাখা হয় তবে খেলাধুলার নির্দিষ্ট ডেটা কোনও লিঙ্কযুক্ত ডেটা কাঠামোয় রাখা হয়। কিছুটা এইরকম:

table Game {
    gameId int,
    teamId1 int fk,
    teamId2 int fk
}

table HockeyGame {
    gameId int fk,
    penaltyMinutes int
}

table BasketballGame {
    gameId int fk,
    freeThrows int
}

এটি আমি প্রস্তাব করতে যাচ্ছিলাম, আরও সম্ভবত গেম টেবিলের একটি কলাম যা গেমের ধরন নির্দেশ করে। আমি বুঝতে পারি যে এটি অন্যান্য টেবিলগুলিতে যোগদান করে অনুমান করা যেতে পারে, তবে গেমের ধরণের সংখ্যা বাড়লে তা ক্লান্তিকর হতে শুরু করে।
ররি হান্টার

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