दिलचस्प पोस्ट
GoogleService प्रारंभ करने में विफल अजगर केवल पहले अक्षर को कैपिटल करते हैं एक दायरे के बिना स्कोप रेज़ोल्यूशन ऑपरेटर अजगर दुभाषिया के अंदर एक फ़ाइल कैसे निष्पादित करें? java.lang.NoSuchMethodError फ्लिंक में कैसे जांचें कि क्या एक जावास्क्रिप्ट क्लास एक दूसरे को प्राप्त करता है (एक obj के बिना)? एन्क्रिप्ट / डिक्रिप्ट फाइलों के लिए ओपनएसएसएल का उपयोग कैसे करें? एंड्रॉइड कैसे रिसाल फ़ोल्डर में डाल कच्चे संसाधनों तक पहुंच प्राप्त करने के लिए? बाइट डेटाग्रिड कॉलम दृश्यता MVVM एंड्रॉइड तिथि पिकर में पिछले तिथियों को अक्षम कैसे करें? सीएसवी में मैं एक HTML तालिका कैसे स्क्रैप कर सकता हूं? इकाई फ़्रेमवर्क 6 के लिए डायनामिक MySQL डाटाबेस कनेक्शन क्यों bool int के एक उपवर्ग है? ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषा के लिए एएसटी (सार सिंटैक्स ट्री) क्या होगा? कैसे दो स्ट्रिंग literals के संयोजन में काम करता है?

डेटाबेस में आप प्रभावशाली मॉडल कैसे प्राप्त कर सकते हैं?

डेटाबेस में विरासत मॉडलिंग के लिए सर्वोत्तम प्रथाएं क्या हैं?

व्यापार-बंद (उदा। प्रश्नावली) क्या हैं?

(मुझे सबसे ज्यादा एसक्यूएल सर्वर और। नेट में दिलचस्पी है, लेकिन मैं यह भी समझना चाहता हूं कि अन्य प्लेटफार्म इस समस्या का समाधान कैसे करते हैं।)

वेब के समाधान से एकत्रित समाधान "डेटाबेस में आप प्रभावशाली मॉडल कैसे प्राप्त कर सकते हैं?"

एक डेटाबेस में विरासत मॉडल के कई तरीके हैं। जो आप चुनते हैं वह आपकी आवश्यकताओं पर निर्भर करता है। यहां कुछ विकल्प हैं:

टेबल-प्रति-प्रकार (टीपीटी)

प्रत्येक वर्ग की अपनी मेज है आधार वर्ग के पास सभी आधार वर्ग के तत्व हैं, और प्रत्येक वर्ग जो एक से प्राप्त होता है, उसकी अपनी तालिका होती है, प्राथमिक कुंजी के साथ जो बेस क्लास तालिका के लिए एक विदेशी कुंजी भी है; व्युत्पन्न सारणी वर्ग में केवल विभिन्न तत्व शामिल हैं

उदाहरण के लिए:

class Person { public int ID; public string FirstName; public string LastName; } class Employee : Person { public DateTime StartDate; } 

जैसे तालिकाओं में परिणाम होगा:

 table Person ------------ int id (PK) string firstname string lastname table Employee -------------- int id (PK, FK) datetime startdate 

टेबल-प्रति-पदानुक्रम (टीपीएच)

एक एकल मेज है जो सभी विरासत पदानुक्रम का प्रतिनिधित्व करता है, जिसका अर्थ है कि कई कॉलम शायद विरल होंगे। एक भेदभावक स्तंभ जोड़ा जाता है जो सिस्टम को बताता है कि यह किस प्रकार की पंक्ति है

ऊपर वर्गों को देखते हुए, आप इस तालिका के साथ समाप्त होते हैं:

 table Person ------------ int id (PK) int rowtype (0 = "Person", 1 = "Employee") string firstname string lastname datetime startdate 

पंक्ति पंक्ति 0 (व्यक्ति) हैं, जो किसी भी पंक्तियों के लिए, स्टार्टडेट हमेशा रिक्त हो जाएगा

टेबल-प्रति-कंक्रीट (टीपीसी)

प्रत्येक वर्ग की अपनी पूरी तरह से बनाई गई तालिका होती है, जिसमें किसी भी अन्य तालिकाओं के संदर्भ नहीं होते हैं।

ऊपर वर्गों को देखते हुए, आप इन तालिकाओं के साथ समाप्त होते हैं:

 table Person ------------ int id (PK) string firstname string lastname table Employee -------------- int id (PK) string firstname string lastname datetime startdate 

उचित डेटाबेस डिजाइन उचित वस्तु डिजाइन की तरह कुछ भी नहीं है

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

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

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

अपने आप से पूछना सबसे अच्छा है, आप कौन से तथ्यों को संचय करना चाहते हैं, आप किन सवालों के उत्तर चाहते हैं, आप कौन-सी रिपोर्टों को उत्पन्न करना चाहते हैं

एक बार उचित डीबी डिजाइन तैयार हो जाने के बाद, प्रश्नों / विचारों को बनाने के लिए यह एक साधारण मामला है, जिससे आप उन वस्तुओं पर अपने ऑब्जेक्ट को सीरियल कर सकते हैं।

उदाहरण:

होटल बुकिंग सिस्टम में, आपको इस तथ्य को संग्रहीत करने की आवश्यकता हो सकती है कि जेन डो 10 अप्रैल को सीव्यू इन के लिए एक कमरे के लिए एक आरक्षण है। क्या यह ग्राहक इकाई का एक विशेषता है? क्या यह होटल इकाई का एक विशेषता है? क्या यह संपत्ति के साथ एक आरक्षण इकाई है जिसमें ग्राहक और होटल शामिल हैं? यह ऑब्जेक्ट ओरिएंटेड सिस्टम में उन सभी चीजों या सभी हो सकता है। एक डेटाबेस में, यह उन चीजों में से कोई भी नहीं है यह केवल एक नंगे तथ्य है

अंतर देखने के लिए, निम्न दो प्रश्नों पर विचार करें। (1) जेन डो के अगले साल के लिए कितने होटल आरक्षण हैं? (2) सेव्यू इन में 10 अप्रैल को कितने कमरे बुक किए जाते हैं?

ऑब्जेक्ट-ओरिएंटेड सिस्टम में, क्वेरी (1) ग्राहक इकाई का एक विशेषता है, और क्वेरी (2) होटल इकाई का एक विशेषता है ये उन वस्तुएं हैं जो उन एपीआई में उन गुणों को उजागर करेंगे। (हालांकि, जाहिर तौर पर आंतरिक तंत्र जिसके द्वारा वे मान प्राप्त होते हैं, उनमें अन्य वस्तुओं के संदर्भ शामिल हो सकते हैं।)

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

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

संक्षिप्त उत्तर: आप नहीं करते हैं।

यदि आपको अपनी वस्तुओं को क्रमबद्ध करने की आवश्यकता है, तो एक ORM का उपयोग करें, या बेहतर कुछ भी जैसे सक्रियक्रॉॉर्ड या प्रलय।

यदि आपको डेटा संग्रहीत करने की आवश्यकता है, तो इसे रिलेशनल तरीके से संभाल कर रखें (आप जो भंडारण कर रहे हैं उसके बारे में सावधान रहना और जेफरी एल व्हाइटलेज ने जो कहा है, उसके बारे में ध्यान देना), अपने ऑब्जेक्ट डिज़ाइन से प्रभावित नहीं।

वहाँ दो प्रमुख प्रकार के विरासत हैं जो आप एक डीबी, टेबल प्रति इकाई और तालिका प्रति पदानुक्रम में सेटअप कर सकते हैं।

तालिका प्रति इकाई है जहां आपके पास एक मूल इकाई तालिका है जिसमें सभी बाल कक्षाओं के साझा गुण हैं। उसके बाद आपके पास प्रत्येक कक्षा में एक और तालिका होगी, जिसमें प्रत्येक कक्षा केवल उस क्लास पर लागू होगी। वे अपने पीके के 1 से जुड़े हुए हैं: 1

वैकल्पिक पाठ http://img.hiwab.com/sql-server/ent.png

सारणी प्रति पदानुक्रम है जहां सभी कक्षाएं एक मेज साझा की जाती हैं, और वैकल्पिक गुण नल योग्य हैं। उनका भी एक भेदभावक क्षेत्र है, जो एक संख्या है जो उस प्रकार को दर्शाता है जो वर्तमान में रिकॉर्ड रखती है

alt पाठ http://img.hiwab.com/sql-server/hier.png सत्रप्रदर्शित विवेकशीलता है

लक्ष्य प्रति पदानुक्रम तेजी से पूछता है जैसे कि आपको जुड़ने की ज़रूरत नहीं है (केवल विभेदक मूल्य), जबकि प्रति इकाई को लक्षित करना आवश्यक है, ताकि यह पता लगाया जा सके कि किस प्रकार की कुछ चीज़ों के साथ-साथ इसके सभी डेटा को पुनः प्राप्त किया जा सकता है ..

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

टीपीटी, टीपीएच और टीपीसी पैटर्न आपके द्वारा जाने वाले तरीके हैं, जैसा कि ब्रैड विल्सन द्वारा उल्लिखित किया गया है। लेकिन कुछ नोट:

  • मूल कक्षा से प्राप्त होने वाली बाल कक्षाओं को डेटाबेस में बेस क्लास परिभाषा के लिए कमजोर संस्थाओं के रूप में देखा जा सकता है, जिसका अर्थ है कि वे अपने बेस-क्लास पर निर्भर हैं और इसके बिना मौजूद नहीं हो सकते हैं। मैंने कई बार देखा है, प्रत्येक यूनिट आईडी के लिए यह अद्वितीय आईडी संग्रहीत की जाती है जबकि एफके को पैरेंट टेबल में भी रखा जाता है। एक एफके पर्याप्त है और इसके अलावा बच्चे और आधार तालिकाओं के बीच एफके-रिलेशन के लिए कैसकेड पर डिलीट करने के लिए बेहतर है।

  • टीपीटी में, केवल बेस टेबल रिकॉर्ड्स को देखने के बाद, आप यह नहीं पा सकते हैं कि रिकॉर्ड किस बाल वर्ग का प्रतिनिधित्व कर रहा है। यह कभी-कभी जरूरी होता है, जब आप सभी अभिलेखों की एक सूची को लोड करना चाहते हैं (प्रत्येक और हर बच्चे की तालिका पर select )। इसे संभाल करने का एक तरीका है, एक कॉलम में चाइल्ड क्लास के प्रकार (टीपीएच में समान पंक्ति प्रकार के समान) का प्रतिनिधित्व करना है, इसलिए किसी तरह टीपीटी और टीपीएच का मिश्रण करना।

मान लीजिए कि हम उस डेटाबेस को डिजाइन करना चाहते हैं जो निम्न आकार वर्ग आरेख रखता है:

 public class Shape { int id; Color color; Thickness thickness; //other fields } public class Rectangle : Shape { Point topLeft; Point bottomRight; } public class Circle : Shape { Point center; int radius; } 

उपरोक्त वर्गों के लिए डेटाबेस डिजाइन इस तरह से हो सकता है:

 table Shape ----------- int id; (PK) int color; int thichkness; int rowType; (0 = Rectangle, 1 = Circle, 2 = ...) table Rectangle ---------- int ShapeID; (FK on delete cascade) int topLeftX; int topLeftY; int bottomRightX; int bottomRightY; table Circle ---------- int ShapeID; (FK on delete cascade) int centerX; int center; int radius; 

आप अपने डेटाबेस का सामान्यीकरण करेंगे और यह वास्तव में आपकी विरासत को दर्पण करेगा इसमें प्रदर्शन में कमी आ सकती है, लेकिन सामान्य रूप से ऐसा कैसे होता है संतुलन को खोजने के लिए आपको शायद अच्छा ज्ञान प्राप्त करना होगा

इसी तरह के धागे के जवाब दोहराएँ

या मैपिंग, विरासत का मानचित्र एक अभिभावक तालिका में जहां माता-पिता और बच्चे तालिकाओं में एक ही पहचानकर्ता का उपयोग होता है

उदाहरण के लिए

 create table Object ( Id int NOT NULL --primary key, auto-increment Name varchar(32) ) create table SubObject ( Id int NOT NULL --primary key and also foreign key to Object Description varchar(32) ) 

उप-ऑब्जेक्ट में ऑब्जेक्ट के लिए एक विदेशी कुंजी संबंध है। जब आप एक SubObject पंक्ति बनाते हैं, तो आपको पहले एक ऑब्जेक्ट पंक्ति बनाना होगा और दोनों पंक्तियों में आईडी का उपयोग करना होगा

संपादित करें: यदि आप मॉडल व्यवहार को भी देख रहे हैं, तो आपको एक प्रकार तालिका की आवश्यकता होगी, जो तालिकाओं के बीच विरासत संबंधों को सूचीबद्ध करता है, और प्रत्येक तालिका के व्यवहार को लागू करने वाले विधानसभा और वर्ग नाम को निर्दिष्ट करता है

लगता है कि ओक्करिल, लेकिन यह सब उस पर निर्भर करता है जो आप इसका उपयोग करना चाहते हैं!

एसक्यूएल अल्केमी (पायथन ओआरएम) का उपयोग करते हुए, आप दो प्रकार की विरासत कर सकते हैं।

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

इस प्रकार, आप सभी भेड़ के लिए पूछ सकते हैं, और सभी भेड़ें प्राप्त कर सकते हैं। या आप केवल राम से पूछ सकते हैं, और केवल राम ही मिलेगा आप ऐसा भी कर सकते हैं जैसे एक रिश्ता है जो केवल राम हो सकता है (यानी भेड़ की पीठ), और इतने पर।

ध्यान दें कि कुछ डेटाबेस इंजिन पहले से ही मूल रूप से विरासत तंत्रों को पोस्टगेस जैसे प्रदान करता है। दस्तावेज़ीकरण देखें ।

उदाहरण के लिए, आप इस तरह से ऊपर दिए गए किसी प्रतिक्रिया में वर्णित व्यक्ति / कर्मचारी प्रणाली से पूछेंगे:

   / * यह सभी व्यक्तियों या कर्मचारियों का पहला नाम दिखाता है * /
   व्यक्ति का चयन प्रथमनाम; 

   / * यह केवल सभी कर्मचारियों की आरंभ तिथि को दर्शाता है * /
   कर्मचारी से प्रारंभ करने का चयन करें;

आपके डेटाबेस की पसंद में, आपको विशेष रूप से स्मार्ट होने की ज़रूरत नहीं है!