आप डेटाबेस में वंशानुक्रम को प्रभावी ढंग से कैसे दर्शाते हैं?


131

डेटाबेस में वंशानुक्रम मॉडलिंग के लिए सर्वोत्तम अभ्यास क्या हैं?

व्यापार-नापसंद (उदाहरण के लिए) क्या हैं?

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


14
यदि आप "सर्वोत्तम अभ्यास" में रुचि रखते हैं, तो अधिकांश उत्तर बस गलत हैं। सबसे अच्छा अभ्यास यह बताता है कि आरडीबी और ऐप स्वतंत्र हैं; उनके पास पूरी तरह से अलग डिजाइन मानदंड हैं। इसलिए एक डेटाबेस में "मॉडलिंग इनहेरिटेंस" (या एक ही ऐप या ऐप भाषा के लिए RDb को मॉडलिंग करना) एक बहुत बुरा अभ्यास है, बेख़बर, और बेसिक RDb डिज़ाइन नियमों को तोड़ता है, और इसे अपंग करता है।
प्रदर्शन


6
@PerformanceDBA तो DB मॉडल में विरासत से बचने के लिए आपका क्या सुझाव है? मान लीजिए कि हमारे पास 50 विभिन्न प्रकार के शिक्षक हैं, और हम उस विशेष शिक्षक को कक्षा से जोड़ना चाहते हैं। विरासत के बिना आप इसे कैसे प्राप्त करेंगे?
स्वलाद

1
@svlada। यह आरडीबी में लागू करने के लिए सीधे-आगे है, इसलिए "विरासत" की आवश्यकता है। एक प्रश्न पूछें, टेबल डिफेंस और एक उदाहरण शामिल करें, और मैं इसका विस्तार से उत्तर दूंगा। यदि आप इसे OO के संदर्भ में करते हैं, तो यह एक शाही गड़बड़ होगी।
प्रदर्शनडिब्बा

जवाबों:


162

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

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

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

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

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

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

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

उपरोक्त कक्षाओं को देखते हुए, आप इस तालिका को समाप्त करते हैं:

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

23
'जो आप चुनते हैं वह आपकी आवश्यकताओं पर निर्भर करता है' - कृपया विस्तृत करें, क्योंकि मुझे लगता है कि विकल्पों के कारण प्रश्न का मूल है।
एलेक्स

12
सवाल पर मेरी टिप्पणी देखें। Rdb तकनीकी शब्दों के लिए मजाकिया नए नामों का उपयोग करने से भ्रम पैदा होता है। "टीपीटी" सुपरटाइप-सबटाइप है। "टीपीएच" असामान्य है, एक सकल त्रुटि। "टीपीएच" और भी कम सामान्यीकृत है, एक और सकल त्रुटि।
प्रदर्शन

45
केवल एक डीबीए यह मान लेगा कि विकेंद्रीकरण हमेशा एक त्रुटि है। :)
ब्रैड विल्सन

7
हालांकि मैं यह स्वीकार करूंगा कि कुछ मामलों में प्रदर्शन के परिणाम में विकेंद्रीकरण परिणाम होता है, यह पूरी तरह से डीबीएमएस में डेटा की तार्किक और भौतिक संरचना के बीच एक अपूर्ण (या कोई नहीं) अलगाव के कारण है। दुर्भाग्य से अधिकांश वाणिज्यिक DBMS इस समस्या से ग्रस्त हैं। @PerformanceDBA सही है। अनिर्धारण एक निर्णय त्रुटि है, गति के लिए डेटा स्थिरता का त्याग करना। अफसोस की बात है, यह एक विकल्प है कि डीबीए या देव को कभी भी बनाने की आवश्यकता नहीं होगी यदि डीबीएमएस ठीक से डिजाइन किए गए थे। रिकॉर्ड के लिए मैं डीबीए नहीं हूं।
केनेथ कोचन

6
@ ब्रैड विल्सन केवल एक डेवलपर, "प्रदर्शन के लिए", या अन्यथा। अक्सर, यह सामान्यीकरण नहीं है, सच यह है कि यह असामान्य है। यह डी-नॉर्मलाइजेशन या अप्राकृतिक एक त्रुटि है, एक तथ्य है, सिद्धांत द्वारा समर्थित है, और लाखों लोगों द्वारा अनुभव किया जाता है, यह "अनुमान" नहीं है।
प्रदर्शन ३०

133

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

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

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

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

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

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

उदाहरण:

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

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

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

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

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


12
+1 अंत में, अज्ञान के समुद्र में वास्तविक ज्ञान का एक द्वीप (और उनकी महत्वाकांक्षा के बाहर कुछ भी जानने से इनकार)। सहमत थे, यह जादू नहीं है: अगर आरडीबी को आरडीबी प्रिस्क्रिप्शन का उपयोग करके डिज़ाइन किया गया है, तो यह "मानचित्र" या "प्रोजेक्ट" किसी भी "वर्ग" के लिए सरल है। RDb को क्लास-आधारित आवश्यकताओं के लिए मजबूर करना केवल गलत है।
प्रदर्शन

2
दिलचस्प जवाब। आप स्वीकार किए गए उत्तर में व्यक्ति-कर्मचारी के उदाहरण का सुझाव कैसे देंगे?
सातफोर्स

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

2
निश्चित रूप से, मेरा सवाल मुख्य रूप से विरासत के मॉडल के तरीके के बारे में था। पर्याप्त स्पष्ट नहीं होने के लिए क्षमा करें। धन्यवाद। जैसा कि आपने उल्लेख किया है, सबसे अधिक संभावना है कि एक Employmentतालिका होनी चाहिए , जो अपनी शुरुआत की तारीखों के साथ सभी रोजगार एकत्र करती है। इसलिए यदि मौजूदा रोजगार की शुरुआत की तारीख जानना Employerमहत्वपूर्ण है, तो यह एक उचित उपयोग मामला हो सकता है View, जिसमें क्वेरी करके वह संपत्ति शामिल है? (ध्यान दें: ऐसा लगता है कि '-' के ठीक बाद मेरे निक के कारण मुझे आपकी टिप्पणी पर कोई सूचना नहीं मिली)
सात

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

9

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

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

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


3
+1 डेटाबेस में मॉडल वंशानुक्रम का प्रयास करना अच्छे, संबंधपरक संसाधनों की बर्बादी है।
डैनियल स्पाइवाक

7

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

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

  • टीपीटी में, केवल बेस टेबल रिकॉर्ड को देखकर, आप यह पता नहीं कर पा रहे हैं कि रिकॉर्ड किस चाइल्ड क्लास का प्रतिनिधित्व कर रहा है। यह कभी-कभी आवश्यक होता है, जब आप सभी रिकॉर्ड की सूची लोड करना चाहते हैं ( 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;

4

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

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

वैकल्पिक शब्द

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

वैकल्पिक शब्द SessionTypeID भेदभाव करनेवाला है

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

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


मैं प्रति ठोस वर्ग पर टारगेट पर भी विचार करूंगा कि वास्तव में इनहेरिटेंस अच्छी तरह से मॉडल नहीं है और इसलिए मैंने नहीं दिखाया।
मैट्लेंट

क्या आप एक संदर्भ जोड़ सकते हैं कि चित्रण कहाँ से है?
चियर्स

आपके द्वारा दिए गए चित्र आपके उत्तर के अंत में कहां हैं?
मूसा हैदरी

1

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


2
लोग क्यों मानते हैं कि डेटाबेस को सामान्य करने से प्रदर्शन में गिरावट आती है? क्या लोग यह भी सोचते हैं कि DRY सिद्धांत कोड प्रदर्शन को नीचा दिखाता है? यह गलत धारणा कहाँ से आती है?
स्टीवन ए। लोव

1
संभवत: क्योंकि अपभ्रंश प्रदर्शन में सुधार कर सकता है, इसलिए सामान्यीकरण इसे अपमानित करता है, अपेक्षाकृत बोल रहा है। यह नहीं कह सकता कि मैं इससे सहमत हूँ, लेकिन शायद यह कैसे हुआ।
मैथ्यू शार्ले

2
प्रारंभ में, सामान्यीकरण का प्रदर्शन पर एक छोटा प्रभाव हो सकता है, लेकिन समय के साथ, जैसे-जैसे पंक्तियों की संख्या बढ़ती है, कुशल JOINs बल्क टेबल को बेहतर बनाना शुरू कर देंगे। बेशक, सामान्यीकरण के अन्य, अधिक लाभ हैं - निरंतरता और अतिरेक की कमी, आदि
रोब

1

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

OR मैपिंग में, पैरेंट टेबल पर इनहेरिटेंस मैप्स जहां पैरेंट और चाइल्ड टेबल एक ही आइडेंटिफायर का उपयोग करते हैं

उदाहरण के लिए

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 का ऑब्जेक्ट के लिए एक विदेशी-कुंजी संबंध है। जब आप एक SubObject पंक्ति बनाते हैं, तो आपको पहले एक ऑब्जेक्ट पंक्ति बनाना होगा और दोनों पंक्तियों में Id का उपयोग करना होगा

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

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


यह चर्चा मॉडलिंग की विरासत के बारे में नहीं, बल्कि हर तालिका में एक जोड़े को जोड़ने के बारे में थी। मुझे लगता है कि सवाल और चर्चा की प्रकृति को बेहतर ढंग से दर्शाने के लिए उस चर्चा का शीर्षक बदला जाना चाहिए।
यहां तक ​​कि मियां

1

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

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

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


1

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

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

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

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

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

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