2012-11-25 34 views
5

सेटअप FK संबंधितक्या कोई विदेशी कुंजी फ़ील्ड नाम के बजाय स्थिर हो सकती है? एसटीआई उपवर्ग

तो यहाँ एक परिदृश्य एक बार आप एसटीआई (सिंगल टेबल विरासत) के साथ खेलने का फैसला जो मैं कर रहा हूँ खोजने के बजाय आम है।

आपके पास विभिन्न उपप्रकारों के साथ कुछ आधार प्रकार है।

  • व्यक्ति < (शिक्षक, छात्र, स्टाफ, आदि)
  • उपयोगकर्ता < (सदस्य, प्रशासन)
  • सदस्य < (क्रेता, विक्रेता)
  • वाहन < (कार, नाव, विमान)
  • आदि

वहाँ मॉडलिंग कि डेटाबेस में करने के लिए दो प्रमुख तरीके हैं:

  • एकल टेबल विरासत
    • एक प्रकार क्षेत्र और नल क्षेत्रों
    • के एक समूह के साथ एक बड़ा तालिका
  • कक्षा टेबल विरासत
    • एक प्रकार प्रति तालिका साझा पी के साथ (FK'd बच्चों से माता-पिता तक)

जबकि एसटीआई के साथ कई मुद्दे हैं, मैं करता हूं जैसे कि आपके द्वारा किए जाने वाले जोड़ों की संख्या में कटौती करने के साथ-साथ रेल जैसे ढांचे में कुछ समर्थन, लेकिन मैं एक मुद्दे पर चल रहा हूं subclass- विशिष्ट तालिकाओं को कैसे संबंधित करें।

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

  • प्रमाणपत्र केवल संदर्भ शिक्षक-व्यक्तियों
  • प्रोफाइल केवल का उल्लेख होना चाहिए सदस्य-उपयोगकर्ता चाहिए
  • WingInformation एक कार या नाव से संबंधित नहीं किया जाना चाहिए किया (जब तक आप बैटमैन शायद रहे हैं)
  • विज्ञापन विक्रेता-सदस्य नहीं क्रेता-सदस्य के स्वामित्व में हैं
सी के साथ

टीआई, इन रिश्तों तुच्छ हैं - बस संबंधित मेज पर एक विदेशी कुंजी तमाचा और आपका काम हो:

ALTER TABLE advertisements 
ADD FOREIGN KEY (seller_id) REFERENCES sellers (id) 

लेकिन एसटीआई के साथ, इसी तरह की बात उप प्रकार प्रतिबंध पर कब्जा नहीं होगा।

ALTER TABLE advertisements 
    ADD seller_type VARCHAR(20) NOT NULL DEFAULT 'seller' 
ALTER TABLE advertisements 
    FOREIGN KEY (seller_id, seller-type) REFERENCES members (id, type) 
:

* Does not work in most (all?) databases * 
ALTER TABLE advertisements 
    ADD FOREIGN KEY (seller_id, 'seller') REFERENCES members (id, type) 

मैं सभी को खोजने के लिए सक्षम किया गया है एक गंदा संबंधित मेज पर एक गणना स्तंभ जोड़ने की आवश्यकता होती है हैक है:

ALTER TABLE advertisements 
    ADD FOREIGN KEY (seller_id) REFERENCES members (id) 

मैं देखना चाहेंगे क्या की तरह कुछ है

यह मुझे अजीब के रूप में हमला करता है (सुरुचिपूर्ण उल्लेख नहीं है)।

असली सवाल

वहाँ एक आरडीबीएमएस जो मुझे ऐसा करने की अनुमति देगा है?

क्या कोई कारण है कि यह भी संभव नहीं है?

क्या यह एक और कारण है कि को छोड़कर एसटीआई का उपयोग न करें, सबसे मामूली मामलों में?

उत्तर

3

विदेशी कुंजी घोषणा में निरंतर घोषित करने का कोई मानक तरीका नहीं है। आपको कॉलम नाम देना होगा।

लेकिन आप एक निश्चित मूल्य के लिए स्तंभ के लिए मजबूर कर सकता है, निम्न विधियों में से एक का उपयोग कर:

  • गणना स्तंभ

  • जांच बाधा

  • उत्प्रेरक सम्मिलित/अपडेट करने से पहले करने के लिए किसी भी उपयोगकर्ता द्वारा प्रदत्त मान को डिफ़ॉल्ट मान के साथ ओवरराइट करें।

+0

धन्यवाद @ बिल और हाँ, मैंने पहले एक गणना या चेक-एंड-ट्रिगर कॉलम का सुझाव देखा है (क्योंकि मैं जो चाहता हूं उसके लिए मानक नहीं है)। क्या आप किसी भी इंजन के बारे में जानते हैं जो मैंने सिंटैक्स का उल्लेख किया है (यहां तक ​​कि कुछ गैर-मानक तरीके से भी)। –

+0

क्षमा करें, मुझे किसी के बारे में पता नहीं है। –