पहली बार डेटाबेस डिजाइन: मैं overengineering हूँ? [बन्द है]


246

पृष्ठभूमि

मैं प्रथम वर्ष का सीएस छात्र हूं और मैं अपने पिताजी के छोटे व्यवसाय के लिए अंशकालिक काम करता हूं। मुझे वास्तविक विश्व अनुप्रयोग विकास का कोई अनुभव नहीं है। मैंने पायथन में स्क्रिप्ट्स लिखी हैं, सी में कुछ कोर्सवर्क, लेकिन ऐसा कुछ नहीं है।

मेरे पिताजी का एक छोटा सा प्रशिक्षण व्यवसाय है और वर्तमान में सभी वर्ग अनुसूचित हैं, रिकॉर्ड किए गए हैं और बाहरी वेब एप्लिकेशन के माध्यम से उनका पालन किया जाता है। एक निर्यात / "रिपोर्ट" सुविधा है, लेकिन यह बहुत सामान्य है और हमें विशिष्ट रिपोर्टों की आवश्यकता है। प्रश्नों को चलाने के लिए हमारे पास वास्तविक डेटाबेस तक पहुँच नहीं है। मुझे एक कस्टम रिपोर्टिंग सिस्टम स्थापित करने के लिए कहा गया है।

मेरा विचार जेनेरिक सीएसवी निर्यात और आयात (संभवत: पायथन के साथ) उन्हें हर रात कार्यालय में होस्ट किए गए एक MySQL डेटाबेस में बनाने का है, जहां से मुझे उन विशिष्ट प्रश्नों को चलाया जा सकता है जिनकी जरूरत है। मुझे डेटाबेस में अनुभव नहीं है, लेकिन बहुत मूल बातें समझ में आती हैं। मैंने डेटाबेस निर्माण और सामान्य रूपों के बारे में थोड़ा पढ़ा है।

हमारे पास जल्द ही अंतरराष्ट्रीय ग्राहक होने शुरू हो सकते हैं, इसलिए मैं चाहता हूं कि डेटाबेस में विस्फोट न हो। वर्तमान में हमारे पास अलग-अलग डिवीजनों (जैसे ACME पैरेंट कंपनी, ACME हेल्थकेयर डिवीजन, ACME बॉडीकेयर डिवीजन) के साथ ग्राहकों के रूप में कुछ बड़े निगम हैं

मैं जिस स्कीमा के साथ आया हूं वह निम्नलिखित है:

  1. ग्राहक के नजरिए से:
    • ग्राहक मुख्य तालिका है
    • ग्राहक जिस विभाग के लिए काम करते हैं उससे जुड़े होते हैं
      • एक देश के चारों ओर विभाग बिखरे हो सकते हैं: लंदन में एचआर, स्वानसी में विपणन, आदि।
      • विभागों को एक कंपनी के विभाजन से जोड़ा जाता है
    • डिवीजनों को मूल कंपनी से जोड़ा जाता है
  2. कक्षाओं के दृष्टिकोण से:
    • सत्र मुख्य तालिका है
      • एक शिक्षक प्रत्येक सत्र से जुड़ा होता है
      • प्रत्येक सत्र के लिए एक स्टेटस दिया जाता है। उदा ० - पूर्ण, १ - रद्द
      • सत्रों को एक मनमाने आकार के "पैक" में वर्गीकृत किया जाता है
    • प्रत्येक पैक एक ग्राहक को सौंपा गया है

मैंने "डिजाइन किया" (अधिक परिमार्जन की तरह) स्कीमा को कागज के एक टुकड़े पर रखा, इसे 3 डी रूप में सामान्य रखने की कोशिश की। फिर मैंने इसे MySQL कार्यक्षेत्र में प्लग किया और इसने मेरे लिए यह सब बहुत सुंदर बना दिया:
( पूर्ण आकार के ग्राफिक के लिए यहां क्लिक करें )

वैकल्पिक शब्द
(स्रोत: maian.org )

उदाहरण के प्रश्न मैं चल रहा हूँ

  • क्रेडिट वाले ग्राहक अभी भी निष्क्रिय हैं (भविष्य में अनुसूचित वर्ग के बिना)
  • प्रति ग्राहक / विभाग / प्रभाग में उपस्थिति दर क्या है (प्रत्येक सत्र में स्थिति आईडी द्वारा मापा जाता है)
  • एक महीने में एक शिक्षक के पास कितनी कक्षाएं होती हैं
  • फ्लैग क्लाइंट्स जिनकी उपस्थिति दर कम है
  • अपने विभागों के लोगों की उपस्थिति दर के साथ मानव संसाधन विभागों के लिए कस्टम रिपोर्ट

प्रशन)

  • क्या यह अतिरंजित है या क्या मैं सही तरीके से नेतृत्व कर रहा हूं?
  • क्या अधिकांश क्वेरी के लिए कई तालिकाओं में शामिल होने की आवश्यकता एक बड़े प्रदर्शन हिट होगी?
  • मैंने ग्राहकों के लिए एक 'अंतिम' कॉलम जोड़ा है, क्योंकि यह शायद एक सामान्य प्रश्न है। क्या यह एक अच्छा विचार है या मुझे डेटाबेस को सख्ती से सामान्य रखना चाहिए?

आपके समय के लिए धन्यवाद


131
प्रिय प्रथम वर्ष सीएस छात्र: कृपया StackOverflow का उपयोग करते रहें। आपका प्रश्न रोचक, अच्छी तरह से लिखित और सहायक है। दूसरे शब्दों में, आप प्रश्न पूछने वाले शीर्ष 1% में हैं।
एडम क्रॉसलैंड

क्या एक डिवीजन में अन्य डिवीजन शामिल हो सकते हैं? यदि ऐसा है तो एक "है" तालिका का उपयोग डिवीजन को उस डिवीजन से जोड़ने के लिए किया जा सकता है जो इसमें निहित है।
मार्क शुल्त्स

इस तरह की टिप्पणियों के लिए धन्यवाद :) मार्क मुझे इस परियोजना के लिए फिर से प्रलेखन पर जाना होगा, लेकिन मुझे नहीं लगता कि हमने उस मामले की पहचान की है। इस पर ध्यान दिलाने के लिए धन्यवाद।
बॉब एस्पोनाजा

1
मुझे आपकी प्राथमिक कुंजी के नामकरण का अनुमान पसंद नहीं है। तालिका divisionsमें नाम का कॉलम है divisionid। क्या आपको वह बेमानी नहीं लगती? बस नाम बताइए id। आपकी तालिका के नाम भी शामिल हैं _has_: मैं इसे हटा दूंगा और उदाहरण के लिए इसे नाम दूंगा cities_departments। जब तक वे उपयोगकर्ता-इनपुट मान नहीं रखते, तब तक आपके DATETIMEकॉलम प्रकार के होने चाहिए TIMESTAMP। मुझे लगता है कि यह एक अच्छा विचार है citiesऔर countriesटेबल है। आप किसी एकल में तालिकाओं को सीमित करने में परेशानी में पड़ सकते हैं status। एक प्रयोग करने पर विचार INTऔर इसलिए आप कर सकते हैं और अधिक वहाँ अर्थ है- पर बिटवाइज़ तुलना प्रदर्शन
जेम्स

@binnyb प्राथमिक कुंजी के नाम के रूप में आईडी का उपयोग करने के बारे में बहुत तर्क है, जिसे लोगों को निर्णय लेने से पहले विचार करना चाहिए।
जेडी

जवाबों:


42

आपके सवालों के कुछ और जवाब:

1) आप किसी ऐसे व्यक्ति के लिए लक्ष्य पर बहुत अधिक हैं जो पहली बार इस तरह की समस्या का सामना कर रहा है। मुझे लगता है कि इस सवाल पर दूसरों के संकेत इस प्रकार बहुत ज्यादा इसे कवर करते हैं। बहुत बढ़िया!

2 और 3) आपके द्वारा लिया जाने वाला प्रदर्शन काफी हद तक आपके विशेष प्रश्नों / प्रक्रियाओं के लिए सही अनुक्रमित होने और अधिक महत्वपूर्ण रूप से रिकॉर्ड की मात्रा के अनुकूलन पर निर्भर करेगा। जब तक आप अपने मुख्य तालिकाओं में एक लाख से अधिक रिकॉर्ड के बारे में बात नहीं कर रहे हैं, तो आप एक पर्याप्त मुख्यधारा डिजाइन होने के लिए ट्रैक पर प्रतीत होते हैं कि प्रदर्शन उचित हार्डवेयर पर कोई समस्या नहीं होगी।

उस ने कहा, और यह आपके प्रश्न 3 से संबंधित है, शुरुआत के साथ आपके पास शायद सामान्य रूप से रूढ़िवाद के लिए प्रदर्शन या अति संवेदनशीलता के बारे में वास्तव में चिंतित नहीं होना चाहिए। यह एक रिपोर्टिंग सर्वर है जो आप बना रहे हैं, लेन-देन आधारित एप्लिकेशन बैकएंड नहीं है, जिसमें प्रदर्शन या सामान्यीकरण के महत्व के संबंध में बहुत अलग प्रोफ़ाइल होगी। लाइव साइनअप और शेड्यूलिंग एप्लिकेशन का समर्थन करने वाले डेटाबेस को उन प्रश्नों से सावधान रहना होगा जो डेटा वापस करने के लिए सेकंड लेते हैं। न केवल एक रिपोर्ट सर्वर फ़ंक्शन में जटिल और लंबी क्वेरी के लिए अधिक सहिष्णुता है, बल्कि प्रदर्शन में सुधार करने की रणनीति बहुत अलग है।

उदाहरण के लिए, लेन-देन आधारित अनुप्रयोग परिवेश में आपके प्रदर्शन सुधार विकल्पों में आपकी संग्रहीत कार्यविधियाँ और तालिका संरचनाएँ nth डिग्री पर ले जाना या आमतौर पर अनुरोधित डेटा की छोटी मात्रा के लिए कैशिंग रणनीति विकसित करना शामिल हो सकता है। एक रिपोर्टिंग वातावरण में आप निश्चित रूप से ऐसा कर सकते हैं, लेकिन आप स्नैपशॉट तंत्र की शुरुआत करके प्रदर्शन पर और भी अधिक प्रभाव डाल सकते हैं, जहां एक अनुसूचित प्रक्रिया पूर्व-कॉन्फ़िगर रिपोर्ट चलाती है और संग्रहीत करती है और आपके उपयोगकर्ता आपके db tier पर बिना किसी तनाव के स्नैपशॉट डेटा का उपयोग करते हैं। प्रति अनुरोध के आधार पर।

यह सब स्पष्ट करने के लिए एक लंबी-घुमावदार शेख़ी है कि आप जो डिज़ाइन सिद्धांत और ट्रिक्स अपनाते हैं, वह आपके द्वारा बनाए जा रहे ड्राफ्ट की भूमिका को अलग-अलग कर सकता है। मुझे उम्मीद है कि यह मददगार होगा।


1
1. धन्यवाद, यह आश्वस्त है! 2 और 3. मुझे अभी भी नहीं पता है कि अनुक्रमणिका कैसे काम करती है, यह कुछ ऐसा है जिसे मैंने पढ़ने की योजना बनाई है। यदि हमारे पास कभी भी एक लाख रिकॉर्ड तक पहुंचने की "समस्या" है, तो शायद अनुभवी डेवलपर्स को नियुक्त करने के लिए एक बजट होगा: पी अलग-अलग डीबी भूमिकाओं में अंतर्दृष्टि के लिए धन्यवाद जो मौजूद हैं, यह मेरे लिए बिल्कुल नया है और जानना बहुत दिलचस्प है। मैं स्नैपशॉट में देखूंगा कि आप जो वर्णन करते हैं वह मूल रूप से परियोजना का अंतिम लक्ष्य है।
बॉब एस्पोनाजा

यदि आप तालिकाओं को समझते हैं, तो अनुक्रमित के मूल तत्व बहुत आसान हैं। वैचारिक रूप से, एक सूचकांक (और अक्सर होता है) एक तालिका के रूप में लागू किया जाता है जिसमें बहुत कम कॉलम होते हैं जिनकी सामग्री मुख्य तालिका से कॉपी की जाती है, और मुख्य तालिका में एक संदर्भ होता है, जिनकी पंक्तियाँ तेजी से पहुंच के लिए हल की जाती हैं। B + ट्री सबसे आम इंडेक्स व्यवस्था है, लेकिन इंडेक्स ऑप्टिमाइज़ेशन वे हैं जहां बड़े खिलाड़ियों के पास अपनी विभेद करने वाली प्रौद्योगिकियां होती हैं, इसलिए यदि आप सादृश्य को बहुत गहराई से लागू करने की कोशिश करते हैं तो यह मूक हो जाता है।
पूजो-पुरुष

14

आपको सही विचार आया है। हालांकि आप इसे साफ कर सकते हैं, और कुछ मैपिंग (* *) तालिकाओं को हटा सकते हैं।

आप जो कुछ कर सकते हैं, वह डिपार्टमेंट्स टेबल में है, CityId और DivisionId जोड़ें।

इसके अलावा, मुझे लगता है कि सब कुछ ठीक है ...


4
मुझे लगता है कि अगर उसे अलग-अलग डिवीजनों या शहरों में विभाग की परिभाषा का फिर से उपयोग करना है तो उसे मैपिंग टेबल की जरूरत है।
याकूब जी

1
हां, मैं सहमत हूं ..... लेकिन यह लग रहा था कि एक विभाग केवल एक शहर / मंडल में हो सकता है। यदि नहीं, तो वह जो था वह निश्चित रूप से सही था।
रेनॉन्ड गोंजो

मेरे पास एक विकि लेख है जिसे मैंने कार्यालय में एक "युक्ति" के साथ लिखा था, मुझे इसे फिर से पढ़ना होगा, लेकिन जैकब जी सही हैं, IIRC कुछ विभाग हैं जो डिवीजनों को फैलाते हैं। ACME स्वास्थ्य सेवा और ACME बॉडीकेयर दोनों के लिए ACME अभिभावकों का एक HR विभाग। अगर मैं इसे आसान बना सकता हूं, हालांकि मैं निश्चित रूप से सुझाव के लिए धन्यवाद करूंगा।
बॉब एस्पोनाजा

6

मेरे द्वारा किए जाने वाले एकमात्र परिवर्तन हैं:
1- अपने वरचेयर को NVARCHAR में बदलें, यदि आप अंतर्राष्ट्रीय जा रहे हैं, तो आप यूनिकोड चाह सकते हैं।

2- अगर संभव हो तो अपनी इंट आईडी को GUID (यूनीक आइडेंटिफायर) में बदल दें (यह सिर्फ मेरी निजी प्राथमिकता हो सकती है)। यह मानते हुए कि आप अंततः उस बिंदु पर पहुँच जाते हैं जहाँ आपके पास कई वातावरण (देव / परीक्षण / मंचन / ठेस) हैं, आप एक से दूसरे में डेटा स्थानांतरित करना चाह सकते हैं। GUID Ids इसे काफी आसान बनाता है।

3- आपकी कंपनी के लिए तीन लेयर्स -> डिवीजन -> डिपार्टमेंट स्ट्रक्चर पर्याप्त नहीं हो सकता है। अब, यह ओवर-इंजीनियरिंग हो सकता है, लेकिन आप उस पदानुक्रम को सामान्य कर सकते हैं जैसे कि आप गहराई के n-स्तरों का समर्थन कर सकते हैं। यह आपके कुछ प्रश्नों को अधिक जटिल बना देगा, जो कि व्यापार-बंद होने के लायक नहीं हो सकता है। इसके अलावा, यह हो सकता है कि किसी भी क्लाइंट के पास अधिक परतें हों, जो आसानी से इस मॉडल में "स्टेबल" हो सकता है।

4- आपके पास क्लाइंट टेबल में एक स्टेटस भी है जो VARCHAR है और इसमें स्टेटस टेबल का कोई लिंक नहीं है। मैं क्लाइंट स्थिति का प्रतिनिधित्व करता है के रूप में वहाँ एक छोटे से अधिक स्पष्टता की उम्मीद है।


1-धन्यवाद, मुझे डायक्ट्रीक्स और UTF8 से परेशानी हो रही है जिसके लिए मैं एक और सवाल पोस्ट करने जा रहा था। शायद यह मुद्दा है। 2- मैंने एसओ पर कुछ अन्य प्रश्न पढ़े हैं, इस मामले पर बहुत सारे परस्पर विरोधी राय के साथ, मैं इस विषय पर अधिक पढ़ रहा हूँ। 3- मैं अपने पिताजी के साथ इस पर फिर से बात करूंगा, मैंने जो "युक्ति" लिखी है उसे देख रहा हूं और देखें कि क्या यह ऐसी चीज है जिस पर हमें गौर करना चाहिए।
बॉब

4- मैं संक्षिप्तता के लिए मुख्य प्रश्न में नहीं गया था: क्लाइंट पर स्थिति यह है कि क्या वे सक्रिय हैं (सत्र शेष हैं) या निष्क्रिय (शेष कोई सत्र नहीं)। अधिक स्पष्टता से, क्या आपके पास कर्नल के लिए अधिक वर्णनात्मक नाम है? जैसे enrolment_status? आपके सहयोग के लिए धन्यवाद।
बॉब एस्पोनाजा

पुनः # 4- अपने स्पष्ट नाम के अलावा, यदि केवल दो राज्य हैं, सक्रिय / निष्क्रिय, तो क्यों न इसे थोड़ा स्तंभ बनाएं?
याकूब जी

3
GUID के बारे में असहमत, कंपकंपी। वे प्रदर्शन के लिए भयानक हो सकते हैं। जब तक आपको प्रतिकृति की आवश्यकता न हो, उनका उपयोग न करें।
HLGEM

1
प्रदर्शन केवल तभी खेला जाता है जब आप किसी तालिका में लाखों पंक्तियों में से 10 बोल रहे हों। यदि आपके पास उस प्रकार की संरचना है, तो आप अनुक्रमिक छापों और रचनात्मक अनुक्रमण के साथ इसे कम कर सकते हैं। अन्यथा, "प्रदर्शन" GUID को छूट देते समय एक लाल हेरिंग है।
याकूब जी

6

ऐसा लगता है कि आप विस्तार के अच्छे स्तर पर डिजाइन कर रहे हैं।

मुझे लगता है कि देश और कंपनियां वास्तव में आपके डिजाइन में एक ही इकाई हैं, जैसे कि शहर और विभाग हैं। मैं देशों और शहरों की तालिकाओं (और शहरों_हेस_डिपार्टमेंट्स) से छुटकारा पाऊंगा और यदि आवश्यक हो, तो कंपनी तालिका (या बस निजी क्षेत्र या सार्वजनिक क्षेत्र की तुलना में अधिक विकल्प होने पर) कंपनी तालिका में एक बूलियन ध्वज IsPublicSector जोड़ें।

इसके अलावा, मुझे लगता है कि आपके विभाग तालिका के उपयोग में कोई त्रुटि है। ऐसा लगता है कि विभागों की तालिका विभिन्न प्रकार के विभागों के संदर्भ के रूप में कार्य करती है जो प्रत्येक ग्राहक प्रभाग के पास हो सकती है। यदि हां, तो इसे डिपार्टमेंटटाइप्स कहा जाना चाहिए। लेकिन आपके ग्राहक (जो हैं, मुझे लगता है, उपस्थित लोग) एक विभाग TYPE के नहीं हैं, वे एक कंपनी में एक वास्तविक विभाग के उदाहरण के हैं। जैसा कि यह अब खड़ा है, आपको पता चल जाएगा कि एक दिया गया ग्राहक कहीं न कहीं मानव संसाधन विभाग का है, लेकिन ऐसा नहीं है!

दूसरे शब्दों में, ग्राहकों को उस तालिका से जोड़ा जाना चाहिए जिसे आप Divisions_Has_Departments कहते हैं (लेकिन मैं बस विभागों को कॉल करूंगा)। यदि ऐसा है, तो आपको ऊपर चर्चा किए गए अनुसार शहरों को विभाजनों में बदलना होगा यदि आप डेटाबेस में मानक संदर्भात्मक अखंडता का उपयोग करना चाहते हैं।


देशों की तालिका इस बात के लिए है कि कब / हमारे पास ऐसे ग्राहक हों जो एक से अधिक देशों में काम करते हों और हर एक के लिए एक अलग एचआर विभाग हो। इस तरह हम जिस देश के साथ काम कर रहे हैं, उस देश के डेटा के साथ रिपोर्ट बना सकते हैं। विभागों और शहरों के लिए समान है, मुझे लगता है कि हमारे पास एक ग्राहक है जिसके पास अलग एचआर डिपो हैं। जिन दो शहरों में उनके मुख्य कार्यालय हैं, या कम से कम वह तर्क था, मैं बैठकर यह देखूंगा कि क्या वे वास्तव में आवश्यक हैं। CompanyType के बारे में नहीं सोचा था, मुझे पता चलेगा कि क्या हमें कुछ ट्रैक करना है।
बॉब एस्पोनाजा

RE: टेबल को प्रदर्शित करता है, मेरा मूल विचार ट्रैक का वास्तविक विभाग के रूप में उपयोग करना था, जिसमें विभाग का नाम टाइप था। यह मेरे पास सिर्फ विभाग के प्रकार के लिए नहीं हुआ था, जो अधिक तर्कसंगत लगता है। यह जानने के बारे में कि कौन सा विभाग और कहां से संबंधित है, मैंने सोचा था कि विभाग को एक शहर और डिवीजन (जो एक कंपनी से जुड़ा हुआ है) से जुड़ा हुआ है। क्या मैं गलत था? शहरों को प्रभागों में ढहाने के लिए, कुछ प्रभाग कई शहरों का विस्तार करते हैं, और मुझे लगता है कि शायद देश भी। मैं इसे फिर से देखूंगा। आपके सहयोग के लिए धन्यवाद।
बॉब एस्पोनाजा

5

वैसे, यह ध्यान देने योग्य है कि यदि आप पहले से ही CSV का निर्माण कर रहे हैं और उन्हें एक mySQL डेटाबेस में लोड करना चाहते हैं, LOAD DATA LOCAL INFILE आपका सबसे अच्छा दोस्त है: http://dev.mysql.com/doc/refman/5.1/ en / load-data.html । Mysqlimport भी देखने लायक है, और एक कमांड-लाइन टूल है जो मूल रूप से लोड डेटा इन्फाइल के आसपास एक अच्छा आवरण है।


3

ज्यादातर चीजें पहले ही कही जा चुकी हैं, लेकिन मुझे लगता है कि मैं एक चीज जोड़ सकता हूं: युवा डेवलपर्स के लिए प्रदर्शन के बारे में चिंता करना बहुत आम है, थोड़ा बहुत ऊपर-नीचे, और तालिकाओं में शामिल होने के बारे में आपका सवाल उस दिशा में जाता है। यह एक सॉफ्टवेयर डेवलपमेंट एंटी-पैटर्न है, जिसे ' प्रीमैच्योर ऑप्टिमाइजेशन ' कहा जाता है । उस पलटा को अपने दिमाग से निकालने की कोशिश करें :)

एक और बात: क्या आप मानते हैं कि आपको वास्तव में 'शहरों' और 'देशों' की तालिकाओं की आवश्यकता है? आपके उपयोग के मामलों के लिए विभाग तालिका में एक 'शहर' और 'देश' कॉलम नहीं होगा? क्या आपके आवेदन को देश और शहर के अनुसार विभागों को सूचीबद्ध करने की आवश्यकता है?


1
जैसा कि हो सकता है की कोशिश करो, यह ove को आगे बढ़ाता है helloworld.c के बड़े ओ की गणना करता है, शहरों का अनुकूलन करता है, जब मैं 3NF डेटाबेस प्राप्त करने के लिए चरणों का पालन कर रहा था तो शहरों और देशों ने खुद को तरह-तरह से चमकाया। मुझे लगता है कि वे जो लाभ प्रदान करते हैं वह शहर / देश के नाम के लिए सुसंगतता है। जैसे अगर हमें म्यूनिख में एक क्लाइंट मिलता है और किसी कारण से जो कोई भी शेड्यूलिंग सिस्टम में एक नए छात्र को प्रवेश देता है, तो वह पिछले छात्रों की तरह म्यूनिख के बजाय इसे मुंचेन कहने का फैसला करता है। इसके अलावा, हमें शहर द्वारा विभागों को सूचीबद्ध करने की आवश्यकता हो सकती है, मुझे जांच करनी होगी। धन्यवाद।
बॉब एस्पोनाजा

2
एक डेटाबेस के डिजाइन चरण में अनुकूलन महत्वपूर्ण है! यह समय से पहले का अनुकूलन नहीं है क्योंकि डेटाबेस के पास लाख रिकॉर्ड होने पर रिफ्लैक्टर करने के लिए काफी कठिन होता है।
HLGEM

1
मैंने यह नहीं कहा कि वह अपने डिजाइन पर तनाव न
हंस वेस्टरबेक

3

बिजनेस इंटेलिजेंस / रिपोर्टिंग विशेषज्ञ और रणनीति / योजना प्रबंधक के रूप में भूमिका के आधार पर निम्नलिखित टिप्पणियां:

  1. मैं ऊपर लैरी की दिशा से सहमत हूं। IMHO, यह इतना अधिक इंजीनियर नहीं है, कुछ चीजें बस जगह से थोड़ा बाहर दिखती हैं। इसे सरल रखने के लिए, मैं क्लाइंट को सीधे कंपनी आईडी, विभाग विवरण, प्रभाग विवरण, विभाग प्रकार आईडी, प्रभाग प्रकार आईडी में टैग करूंगा। लंबी अवधि की स्थिरता के लिए लुकअप टेबल और आंतरिक रिपोर्टिंग / विश्लेषण क्षेत्रों के संदर्भ के रूप में विभाग प्रकार आईडी और डिवीजन प्रकार आईडी का उपयोग करें।

  2. पैक्स टेबल में "क्रेडिट" कॉलम होता है, क्या वास्तव में क्लाइंट बेस टेबल से बंधा नहीं होना चाहिए ताकि अगर वे कई पैक आप देख सकें कि भविष्य की कक्षाओं के लिए कितना क्रेडिट बकाया है? एप्लिकेशन कैल्क की देखभाल कर सकता है और इसे ग्राहक तालिका में केंद्रीय रूप से संग्रहीत कर सकता है।

  3. कंपनी की जानकारी स्पष्ट पते / फोन / आदि सहित कई और क्षेत्रों का उपयोग कर सकती है। जानकारी। मैं D & B "DUNs" कॉलम (साइट / ब्रांच / अल्टीमेट) लॉन्ग टर्म, Dun और ब्रैडस्ट्रीट (D & B) में कंपनियों को जोड़ने के लिए तैयार रहूंगा, जिनके पास कंपनियों की एक बड़ी सूची है और आपको बाद में पता चलेगा कि उनकी जानकारी बहुत उपयोगी है रिपोर्टिंग / विश्लेषण के लिए। यह आपके द्वारा उल्लिखित कई डिवीजन इश्यू का ध्यान रखेगा, और आपको उप / विभाजन / शाखाओं / आदि के लिए उनके पदानुक्रम को रोल करने की अनुमति देगा। बड़ी कोर की।

  4. आपने यह उल्लेख नहीं किया है कि आप कितने रिकॉर्ड के साथ काम कर रहे हैं, जो एक बड़ी विकास पहल के लिए खुद को स्थापित कर सकता है, जो कि "रिपोर्टिंग" सॉफ़्टवेयर के साथ तेज और बहुत कम सिरदर्द हो सकता है। यदि आपका एक बड़े डेटाबेस (<65000) पंक्तियों के साथ काम नहीं कर रहा है, तो सुनिश्चित करें कि MS-Access, OpenOffice (बेस) या संबंधित रिपोर्ट / ऐप देव समाधान ट्रिक नहीं कर सकते हैं। मैं ओरेकल के मुफ्त एपेक्स सॉफ्टवेयर का उपयोग खुद से बहुत कम करता हूं, यह उनके मुफ्त डेटाबेस ओरेकल एक्सई के साथ आता है बस इसे अपनी साइट से डाउनलोड करें।

  5. FYI करें - रिपोर्टिंग की जानकारी: बड़े डेटाबेस के लिए, आपके पास आमतौर पर दो डेटाबेस उदाहरण होते हैं) प्रत्येक विस्तृत रिकॉर्ड को रिकॉर्ड करने के लिए लेनदेन डेटाबेस। बी) रिपोर्टिंग डेटाबेस (डेटा मार्ट / डेटा वेयरहाउस) एक अलग मशीन पर रखे गए। अधिक जानकारी के लिए गूगल पर स्टार स्कीमा और स्नोफ्लेक स्कीमा दोनों को खोजें।

सादर।


1. क्या आपका मतलब उन सभी कॉलमों को क्लाइंट टेबल से जोड़ना है? मुझे लगता है कि यह सामान्यीकरण को तोड़ देगा, और इसे लगातार बनाए रखने के लिए कठिन बना देगा, मुझे यकीन नहीं है कि मैं सही तरीके से समझ गया हूं। 2. पैक अनुक्रमिक हैं, केवल सबसे हाल के पैक में क्रेडिट बकाया हो सकता है, इसलिए कई पैक को ट्रैक करने की आवश्यकता नहीं है। क्या आप अभी भी इस मामले में इसे ग्राहक तालिका में संग्रहीत करने की अनुशंसा करेंगे? 3. ऐसा लगता है कि यह क्लाइंट कंपनियों के ढांचे का पता लगाने में बहुत मददगार होगा, मैं इसे धन्यवाद कहूंगा।
बॉब एस्पोनाजा

4. मुझे अगले वर्ष में उन ग्राहकों और सत्रों की संख्या की जांच करनी होगी, जिनकी अपेक्षा मुझे है, लेकिन सत्र तालिका के लिए मेरे लिए यह संभव है कि एक या एक वर्ष में कई पंक्तियों तक पहुँच सकें। मैं रिपोर्टिंग सॉफ़्टवेयर पर ध्यान दूंगा, यह मेरे लिए नहीं हुआ था। 5. ऐसा लगता है कि मैं दुर्घटना से आ गया हूँ; वेब ऐप हमारा "ट्रांजेक्शन डेटाबेस" होगा और यह प्रोजेक्ट "रिपोटिंग डेटाबेस" :) आपके इनपुट के लिए धन्यवाद।
बॉब एस्पोनाजा

1. हाँ ग्राहक तालिका में "कंपनी आईडी, विभाग विवरण, प्रभाग विवरण, विभाग प्रकार आईडी, प्रभाग प्रकार आईडी" कॉलम जोड़ रहा है। ग्राहक एक कंपनी का होता है, एक कंपनी के भीतर एक विशिष्ट विभाग प्रकार (IT / Ops / Admin / etc) और एक अलग डिवीजन प्रकार (सेल्स / एचआर / बिजनेस की मार्केटिंग लाइनें)। 2. मुझे लगता है कि क्रेडिट एक ग्राहक या कंपनी के साथ जुड़ा हुआ है न कि सत्र के पैक के साथ। यह एक व्यावसायिक निर्णय है जिसे आप कर सकते हैं।
होगा

लैरी ने कंपनी और देश के संयोजन का भी उल्लेख किया। मैं पूरी तरह से सहमत हूं और डी एंड बी संदर्भ के संबंध में वापस जाना चाहता हूं। मैं एक ही कंपनी के कई स्थानों के लिए अनुमति देने के लिए किसी साइट या कुछ अद्वितीय का उपयोग करूँगा और फिर विभागों को एक अद्वितीय साइटआईडी से जोड़ दूंगा।
:

2

मैं केवल इस चिंता को दूर करना चाहता हूं कि म्यूटेंट टेबल में शामिल होने से एक प्रदर्शन प्रभावित होगा। सामान्य होने से डरो मत क्योंकि आपको जॉइन करना होगा। जुड़ने वाले सामान्य हैं और संबंधपरक डेटाबेस में अपेक्षित हैं और उन्हें अच्छी तरह से संभालने के लिए डिज़ाइन किया गया है। आपको पीके / एफके संबंध स्थापित करने की आवश्यकता होगी (डेटा अखंडता के लिए, यह डिजाइनिंग में विचार करना महत्वपूर्ण है) लेकिन कई डेटाबेस में एफके स्वचालित रूप से अनुक्रमित नहीं होते हैं। चूंकि वे wil को जॉइन में इस्तेमाल किया जाता है, आप निश्चित रूप से FKS को इंडेक्स करके शुरू करना चाहेंगे। पीके आमतौर पर सृजन पर एक सूचकांक प्राप्त करते हैं क्योंकि उन्हें अद्वितीय होना चाहिए। यह सच है कि डेटावेयरहाउस डिज़ाइन में जुड़ने की संख्या कम हो जाती है, लेकिन आमतौर पर किसी को डेटा वेयरहाउसिंग की बात नहीं आती, जब तक कि एक रिपोर्ट में एक्सेस करने के लिए लाखों रिकॉर्ड की आवश्यकता न हो। तब भी लगभग सभी डेटा वेयरहाउस वास्तविक समय में डेटा एकत्र करने के लिए एक ट्रांजेक्शनल डेटाबेस के साथ शुरू होते हैं और फिर डेटा को शेड्यूल (रात या मासिक या जो भी व्यवसाय की आवश्यकता होती है) पर वेयरहाउस में ले जाया जाता है। तो यह एक अच्छी शुरुआत है भले ही आपको रिपोर्ट प्रदर्शन को बेहतर बनाने के लिए डेटा वेयरहाउस को डिज़ाइन करने की आवश्यकता हो।

मुझे कहना होगा कि आपका डिजाइन प्रथम वर्ष के सीएस छात्र के लिए प्रभावशाली है।


1

यह अधिक इंजीनियर नहीं है, इस तरह से मैं समस्या का सामना करूंगा। ज्वाइनिंग ठीक है, बहुत ज्यादा परफॉर्मेंस हिट नहीं होगी (यह पूरी तरह से आवश्यक है जब तक कि आप डेटाबेस को डी-नॉर्मल न कर दें जो अनुशंसित नहीं है!)। स्थितियों के लिए, देखें कि क्या आप उस तालिका को बाहर करने के बजाय एक एनुम डेटाटाइप का उपयोग कर सकते हैं।


दुश्मनी बुराई है। हर बार आपको एनम का विस्तार करने की आवश्यकता होती है, आपको अपनी तालिका को फिर से बनाना होगा - जो तब तक ठीक है जब तक कि आपकी तालिका आकार में कई जीबी न हो जाए।
मार्टिन

इनपुट और सुझाव के लिए धन्यवाद क्रिस, मुझे चिंता थी कि मैं एक अत्यधिक जटिल राक्षस बनाऊंगा। मार्टिन, स्थितियां बहुत अच्छी तरह से परिभाषित और स्थिर हैं: मूल रूप से 0-कम्प्लीट क्लास, 1-क्लास रद्द, 2-डिडक्ट नहीं। मुझे लगता है कि ये तीनों एक वर्ग के किसी भी संभावित परिणाम को कवर करते हैं। क्या इस मामले में अभी भी एनम का उपयोग करना एक बुरा विचार है?
बॉब एस्पोनाजा

यह मेरे दिमाग में, एक एनम के लिए एकदम सही लगता है। सभी संभावित परिणाम समय से पहले संतुष्ट हैं। एक इंट ठीक भी है जिसे आप अपने ऐप में एक एनम या स्टैटिक इनट द्वारा दर्शा सकते हैं। वास्तव में कोई बात नहीं है :) अगर आप अपने डेटाबेस को कुछ टूल का उपयोग करके संपादित करते हैं, तो एनम देखने के लिए अच्छे हैं।
क्रिस डेनेट

enums समस्याग्रस्त हो सकता है (शायद बुराई बहुत मजबूत शब्द है) जब आपके पास बड़ी तालिकाएं हों जो ऑनलाइन 24x7 होनी चाहिए और एनम को बदलना होगा। यह देखते हुए कि आप टेबलों को खरोंच से हटा रहे हैं - इसके बारे में चिंता न करें। एक छोटे से पर्याप्त डेटा सेट को देखते हुए, आप केवल तार का उपयोग कर सकते हैं।
मार्टिन

1

मैंने प्रशिक्षण / स्कूल डोमेन में काम किया है और मुझे लगा कि मैं बताऊंगा कि आम तौर पर एक एम: 1 रिश्ता है जिसे आप "सत्र" (किसी दिए गए पाठ्यक्रम के उदाहरण) और पाठ्यक्रम के बीच का संबंध कहते हैं। दूसरे शब्दों में, आपकी सूची पाठ्यक्रम ("स्पैनिश 101" या जो भी हो) प्रदान करती है, लेकिन आपके पास एक एकल सेमेस्टर (स्मिथ द्वारा पढ़ाए जाने वाले Tu-Th, जोन्स द्वारा पढ़ाया गया बुध-शुक्र) के दौरान इसके दो अलग-अलग उदाहरण हो सकते हैं।

इसके अलावा, यह एक अच्छी शुरुआत की तरह दिखता है। मुझे यकीन है कि आप पाएंगे कि क्लाइंट डोमेन ("क्लाइंट" के लिए अग्रणी ग्राफ़) आपके द्वारा मॉडलिंग किए जाने की तुलना में अधिक जटिल है, लेकिन जब तक आपको मार्गदर्शन करने के लिए कुछ वास्तविक डेटा नहीं मिला है, तब तक इसके साथ ओवरबोर्ड न जाएं।


अगर मैं तुम्हें सही ढंग से समझ गया हूँ तो यह बिलकुल नहीं है। "पाठ्यक्रम" बाद के सत्रों के समूह हैं। यह एक पारंपरिक सेमेस्टर-आधारित प्रणाली नहीं है। मैं किसी और चीज के बारे में नहीं सोच सकता जिसे क्लाइंट डोमेन में जोड़ा जा सकता है, क्या आपके पास कोई उदाहरण है? इसके अलावा, मैं चिंतित था कि मैं पहले से ही जटिलता के साथ पानी में गिर गया था, खुशी की बात नहीं है :) आपके इनपुट के लिए धन्यवाद।
बॉब एस्पोनाजा

0

कुछ बातें दिमाग में आईं:

  1. टेबल रिपोर्टिंग के लिए तैयार लग रहे थे, लेकिन वास्तव में व्यवसाय नहीं चला रहे थे। मुझे लगता है कि जब कोई ग्राहक साइन अप करता है, तो अनिवार्य रूप से सत्र की सूची में भाग लेने वाले ग्राहक के लिए एक आदेश दिया जाता है, और यह आदेश एक कंपनी में कई कर्मचारियों के लिए हो सकता है। ऐसा लगता है कि "ऑर्डर" तालिका वास्तव में आपके सिस्टम के केंद्र में होगी और आपके डेटा कैप्चर और अंतिम रिपोर्टिंग को चलाएगी। (एक तार्किक मेल है या नहीं, यह देखने के लिए अपने डेटाबेस डिज़ाइन के साथ व्यवसाय को चलाने के लिए आपके द्वारा उपयोग किए जा रहे कागजी दस्तावेजों की तुलना करें।)

  2. कंपनियों के पास अक्सर विभाजन नहीं होते हैं। कर्मचारी कभी-कभी डिवीजनों / विभागों को बदलते हैं, शायद मध्य सत्र भी। कंपनियां कभी-कभी डिवीजनों / विभागों को जोड़ / हटा / नाम बदल देती हैं। सुनिश्चित करें कि आपके टेबल की संभावित रियलटाइम बदलती सामग्री बाद की रिपोर्टिंग / समूहीकरण को कठिन नहीं बनाती है। इतने सारे तालिकाओं पर बहुत अधिक संपर्क डेटा के विभाजन के साथ, आपको अपनी रिपोर्ट को सार्थक और समावेशी रखने के लिए बहुत सख्त डेटा प्रविष्टि सत्यापन को लागू करना पड़ सकता है। जैसे, जब एक नया ग्राहक जोड़ा जाता है, तो सुनिश्चित करें कि उसकी कंपनी / विभाग / विभाग / शहर उसके सहकर्मियों के समान मूल्यों से मेल खाते हैं।

  3. "पैक्स" की अवधारणा बिल्कुल भी स्पष्ट नहीं है।

  4. चूंकि आप इंगित करते हैं कि यह एक छोटा व्यवसाय है, इसलिए यह आश्चर्यजनक होगा कि प्रदर्शन एक मुद्दा होगा, वर्तमान मशीनों की गति और क्षमता को देखते हुए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.