अंततः, यह उपयोग और वास्तुकला के लिए नीचे आता है।
आर्किटेक्चर
क्या सिस्टम "किसी भी खेल" को संभालता है? क्या यह विचार है कि आप अपनी वास्तुकला अंतरिक्ष यात्री टोपी पर रखते हैं, और एक सामान्य प्रणाली का निर्माण करते हैं जो भविष्य के किसी भी प्रकार के खेल को संभाल सकता है जो आज भी मौजूद नहीं हो सकता है?
यदि हां, तो स्पष्ट रूप से गतिशील रूप से नामित तालिकाओं में बहुत बड़ा दर्द होता है, इसलिए यदि आवश्यक हो, तो यह एक स्कीमा है जो एन खेलों का समर्थन करता है।
उस ने कहा, मेरे पास इस दृष्टिकोण के खिलाफ एक बहुत मजबूत पूर्वाग्रह है: यह लगभग हमेशा अधिक काम होता है और खराब परिणामों की ओर जाता है। प्रत्येक खेल के लिए एक अलग यूआई, स्कीमा, आदि बनाने से अंततः बेहतर उपयोगकर्ता अनुभव और कोड को बनाए रखना आसान हो जाएगा, भले ही इसका मतलब कुछ सतही मात्रा में दोहराव हो (कैसे बचें / इसे कम करें यह एक अलग सवाल है)।
आप ऐसे खिलाड़ियों को कैसे संभालते हैं जो कई खेल खेलते हैं? क्या उन्हें दो प्रविष्टियाँ मिलती हैं (जैसे, आप विभिन्न लोगों के रूप में व्यवहार करते हैं) या आप उनके साथ कुछ विशिष्ट करने की कोशिश कर रहे हैं?
उपयोग
तो चलिए मान लेते हैं कि आप गतिशील रूप से खेल नहीं करते हैं (जैसे, अगर कोई नया खेल जोड़ना चाहता है, तो उसे जोड़ने के लिए विकास के प्रयास की आवश्यकता होती है)।
क्या कभी ऐसा समय होता है जहाँ आप एक समय में एक से अधिक खेलों से खिलाड़ियों (या आपके द्वारा उल्लिखित किसी अन्य वस्तु) को प्रदर्शित कर रहे हैं?
मैं इसे एक खोज फंक्शन के लिए देख सकता था, जहाँ आप खिलाड़ी या टीम के नाम (खेल की परवाह किए बिना) को खोज सकते थे, लेकिन इससे आगे मैं इसके उपयोग के मामलों की कल्पना नहीं कर सकता था।
यदि आपको कभी ऐसा करने की आवश्यकता नहीं है, तो आपका दृष्टिकोण पूरी तरह से ठीक है। आप यहां पढ़ना बंद कर सकते हैं।
वैकल्पिक योजनाएँ
दृश्य
मैं 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/...
या फिर भी अपने अनुप्रयोग है कि करता है)।
टेबल इनहेरिटेंस
टेबल इनहेरिटेंस काम कर सकता है, लेकिन बहुत जटिल है। मेरे पास इसके साथ एक टन का अनुभव नहीं है, और वास्तव में, मुझे लगता है कि हर बार जब मैं इसका मूल्यांकन करने में शामिल होता हूं तो हम कुछ सरल कर रहे हैं (जैसे मैं यहां सुझाव दे रहा हूं)।
इसलिए व्यक्तिगत रूप से, मुझे अभी तक यह पता लगाना है कि यह क्यों उपयोगी होगा, लेकिन शायद एक ठोस उपयोग का मामला है (जो मुझे पता नहीं है) जो कि जटिलता को सही ठहराता है (उदाहरण के लिए, तालिका उत्तराधिकार उपयोग के मामले को किसी अन्य समाधान से बेहतर हल करता है) ।
खेल-विशिष्ट विशेषताओं के लिए अलग टेबल
आप एक एकल players
तालिका कर सकते हैं, जिसमें सभी खेलों के सभी खिलाड़ियों के लिए सामान्य गुण होते हैं, और फिर टेबल का एक और सेट जैसे nhl_players_details
कि एक खिलाड़ी और अतिरिक्त जानकारी वाले स्तंभ खिलाड़ी पर होता है। यदि आम विशेषताओं का एक टन है, या आपके पास "सभी खेलों के सभी खिलाड़ियों" के कई उपयोग हैं तो यह समझ में आ सकता है।
खेल-विशिष्ट विशेषताओं के लिए मुख्य मूल्य जोड़े
पूरी तरह से वैकल्पिक दृष्टिकोण: एक है players
तालिका (फिर से, नाम की तरह आम विशेषताओं के साथ) और फिर एक player_data
है कि मेज PlayerId
, Sport
, Attribute
, Value
। दर्ज किए गए विशेषता नाम खेल-विशिष्ट होंगे। यह आपको स्कीमा को संशोधित किए बिना अनिवार्य रूप से नई विशेषताओं को जोड़ने की अनुमति देता है (आपके कोड को अभी भी उन्हें लोड करने / प्रदर्शित करने के लिए जानना होगा)। दोष यह है कि आप कुछ अखंडता खो देते हैं: मूल्य आमतौर पर एक स्ट्रिंग फ़ील्ड होगा, इसलिए आपके ऐप कोड को लचीला होना होगा और स्ट्रिंग value
को एक विशिष्ट डेटा प्रकार (जैसे पूर्णांक) में परिवर्तित करने में संभावित विफलताओं को संभालना होगा ।
यह अवधारणा निश्चित रूप से टीमों, खेलों आदि पर लागू हो सकती है।