आप विरासत का उपयोग कर रहे हैं (इकाई-संबंध मॉडलिंग में "सबक्लास" या "श्रेणी" के रूप में भी जाना जाता है)।
- "सभी एक तालिका में वर्ग": सिर्फ एक मेज सभी माता पिता और बच्चे के साथ माता-पिता और बच्चों की कक्षाएं (यानी "कवर" है सामान्य में, वहाँ डेटाबेस में यह प्रतिनिधित्व करने के लिए 3 तरीके हैं कॉलम), एक जांच की बाधा के साथ फ़ील्ड का सही सबसेट गैर-नल (यानी दो अलग-अलग बच्चे "मिश्रण" नहीं करते हैं)।
- "प्रति तालिका कंक्रीट वर्ग": प्रत्येक बच्चे के लिए एक अलग टेबल है, लेकिन कोई अभिभावक तालिका नहीं है। इसके लिए माता-पिता के संबंधों की आवश्यकता होती है (आपके मामले में सूची < - संग्रहण) सभी बच्चों में दोहराया जाना चाहिए।
- "कक्षा प्रति वर्ग": प्रत्येक बच्चे के लिए अभिभावक तालिका और एक अलग तालिका होने के नाते, जो आप करने की कोशिश कर रहे हैं। यह सबसे साफ है, लेकिन कुछ प्रदर्शन खर्च कर सकते हैं (ज्यादातर डेटा संशोधित करते समय, पूछताछ करते समय इतना नहीं, क्योंकि आप सीधे बच्चे से जुड़ सकते हैं और माता-पिता को छोड़ सकते हैं)।
मैं आमतौर पर 3 प्रक्रिया अपनाते हैं, लेकिन दोनों उपस्थिति और आवेदन स्तर पर एक बच्चे की विशिष्टता लागू। डेटाबेस स्तर पर दोनों को लागू करना थोड़ा बोझिल है, लेकिन डीबीएमएस स्थगित बाधाओं का समर्थन करता है तो किया जा सकता है। उदाहरण के लिए:
CHECK (
(
(VAN_ID IS NOT NULL AND VAN_ID = STORAGE_ID)
AND WAREHOUSE_ID IS NULL
)
OR (
VAN_ID IS NULL
AND (WAREHOUSE_ID IS NOT NULL AND WAREHOUSE_ID = STORAGE_ID)
)
)
यह (CHECK
के कारण) दोनों विशिष्टता और उपस्थिति बच्चे की (CHECK
के संयोजन और FK1
/FK2
के कारण) को लागू करेगा।
दुर्भाग्यवश, एमएस एसक्यूएल सर्वर does not support deferred constraints, लेकिन आप संग्रहीत प्रक्रियाओं के पीछे पूरे ऑपरेशन को "छिपाने" में सक्षम हो सकते हैं और ग्राहकों को सीधे टेबल को संशोधित करने से मना कर सकते हैं।
बस विशिष्टता टाल बाधाओं के बिना लागू किया जा सकता:
STORAGE_TYPE
एक प्रकार discriminator, आमतौर पर एक (उपरोक्त उदाहरण में स्थान बचाने के लिए पूर्णांक है, 0 और 1 हैं " ज्ञात "आपके आवेदन के लिए और तदनुसार व्याख्या की गई)।
VAN.STORAGE_TYPE
और WAREHOUSE.STORAGE_TYPE
(उर्फ। "गणना") कॉलम भंडारण बचाने के लिए और CHECK
रों के लिए जरूरत से बचने के लिए की जा सकती है।
--- संपादित करें ---
परिकलित स्तंभों इस तरह एसक्यूएल सर्वर के तहत काम करेगा:
CREATE TABLE STORAGE (
STORAGE_ID int PRIMARY KEY,
STORAGE_TYPE tinyint NOT NULL,
UNIQUE (STORAGE_ID, STORAGE_TYPE)
);
CREATE TABLE VAN (
STORAGE_ID int PRIMARY KEY,
STORAGE_TYPE AS CAST(0 as tinyint) PERSISTED,
FOREIGN KEY (STORAGE_ID, STORAGE_TYPE) REFERENCES STORAGE(STORAGE_ID, STORAGE_TYPE)
);
CREATE TABLE WAREHOUSE (
STORAGE_ID int PRIMARY KEY,
STORAGE_TYPE AS CAST(1 as tinyint) PERSISTED,
FOREIGN KEY (STORAGE_ID, STORAGE_TYPE) REFERENCES STORAGE(STORAGE_ID, STORAGE_TYPE)
);
-- We can make a new van.
INSERT INTO STORAGE VALUES (100, 0);
INSERT INTO VAN VALUES (100);
-- But we cannot make it a warehouse too.
INSERT INTO WAREHOUSE VALUES (100);
-- Msg 547, Level 16, State 0, Line 24
-- The INSERT statement conflicted with the FOREIGN KEY constraint "FK__WAREHOUSE__695C9DA1". The conflict occurred in database "master", table "dbo.STORAGE".
दुर्भाग्य से, एसक्यूएल सर्वर एक गणना स्तंभ जो एक विदेशी में प्रयोग किया जाता है के लिए की आवश्यकता है की पेशकश की जाने वाली कुंजी। अन्य डेटाबेस में यह सीमा नहीं हो सकती है (उदा। ओरेकल के आभासी कॉलम), जो कुछ संग्रहण स्थान को बचा सकता है।
कृपया अच्छी तरह से मूल्यांकन करता है, तो आप वास्तव में एक रिश्ते के लिए एक की जरूरत है। अधिकांश समय जब आपको लगता है कि आपको एक की जरूरत है, तो आप वास्तव में नहीं करते हैं। –
ईईआर का प्रयोग करें। यहां की कुंजी रिश्ते के प्रकार की पहचान करना है 'है', 'है'/'से संबंधित है, या वे एक ही सुपरटेप के उपप्रकार हैं। फिर अपनी इकाइयों को टेबल पर कम करें। – Oybek
आह ठीक है, तो फिर स्टोरेज टेबल एक सुपरक्लास है और वैन/वेयरहाउस टेबल्स उपप्रकार हैं, लेकिन अब क्या? lol – Luckyl337