सशर्त विदेशी कुंजी संबंध


14

वर्तमान में मेरे पास दो संस्थाओं के बीच एक विदेशी कुंजी है, और मैं उस संबंध को तालिका में से किसी एक की इकाई के लिए सशर्त बनाना चाहूंगा। यहाँ तालिकाओं की पदानुक्रम है, यह बच्चे से माता-पिता के लिए एफके रिफ्रेन्स के माध्यम से किया जाता है

                  Store
            /                \
  Employees                    \
                             TransactionalStores
                            /       |         \
                     Kiosks         |          BrickMortars
                                 Onlines

वर्तमान में मेरे पास स्टोर करने के लिए कर्मचारी से एक एफके संबंध है

ALTER TABLE Employees ADD CONSTRAINT Employee_Store
            FOREIGN KEY (TransStoreId)
            REFERENCES TransactionalStores(StoreId)

मैं सशर्त जोड़ना चाहूंगा:

WHERE TransactionalStores.storeType != 'ONLINE_TYPE'

क्या यह संभव है या क्या मुझे TransactionalStores को दो नए उप-वर्गों (जैसे PhysicalStores और VirtualStores) में उप-वर्ग करना चाहिए


जवाबों:


18

विदेशी कुंजियों को सशर्त बनाया जा सकता है ... तरह। आप प्रत्येक तालिका का लेआउट नहीं दिखाते हैं, इसलिए यहां एक विशिष्ट डिजाइन है जो आपके रिश्तों को दिखा रहा है:

create table TransactionalStores(
    ID        int   not null auto_increment,
    StoreType char  not null,
    ..., -- other data
    constraint CK_TransStoreType check( StoreType in( 'B', 'K', 'O' )),
    constraint PK_TransactionalStores primary key( ID ),
    constraint UQ_TransStoreTypes unique( ID, StoreType ) -- for FK references
);
create table Kiosks(
    ID         int   not null,
    StoreType  char  not null,
    ..., -- other Kiosk data
    constraint CK_KioskStoreType check( StoreType = 'K' ), -- kiosks only
    constraint PK_Kiosks primary key( ID, StoreType ),
    constraint FK_Kiosks_TransStores foreign key( ID, StoreType )
        references TransactionalStores( ID, StoreType )
);

Onlines और BrickMorters के पास एक ही मूल संरचना होगी, लेकिन StoreType ने केवल 'O' या 'B' को ही उपयुक्त माना।

अब आप एक अन्य तालिका से TransactionalStores (और इसके माध्यम से विभिन्न स्टोर टेबल) के लिए एक संदर्भ चाहते हैं, लेकिन कियोस्क और ब्रिकमार्ट तक सीमित है। एकमात्र अंतर बाधा में होगा:

create table Employees(
    ID         int       not null,
    StoreID    int,
    StoreType  char,
    ..., -- other Employee data
    constraint PK_Employees primary key( ID ),
    constraint CK_Employees_StoreType check( coalesce( StoreType, 'X' ) <> 'O' )), -- Online not allowed
    constraint FK_Employees_TransStores foreign key( StoreID, StoreType )
        references TransactionalStores( ID, StoreType )
);

इस तालिका में, FK संदर्भ बलों StoreType को 'K', 'O' या 'B' होने के लिए बाध्य करता है, लेकिन क्षेत्र की बाधा इसे केवल 'K' या 'B' तक सीमित करती है।

चित्रण के लिए, मैंने TransactionStores तालिका में स्टोर प्रकारों को सीमित करने के लिए एक चेक बाधा का उपयोग किया है। वास्तविक जीवन में, StoreType के साथ एक StoreTypes लुकअप तालिका उस तालिका के लिए एक FK होने के कारण संभवतः बेहतर डिज़ाइन विकल्प होगी।


9

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

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

यहाँ छवि विवरण दर्ज करें

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