2015-11-23 12 views
5

में एकाधिक/विभाजित वर्ग संघों में मेरे पास निम्न ऑब्जेक्ट्स और संबंध परिभाषित हैं। यह वास्तव में एक साधारण मामला है, और मैं केवल उन सभी क्षेत्रों को यह दिखाने के लिए प्रदान कर रहा हूं कि मुझे क्यों लगता है कि इनहेलेशन और इंजेक्शन संज्ञाहरण को दो अलग-अलग वर्गों द्वारा परिभाषित किया जाना चाहिए।sqlalchemy

class InhalationAnesthesia(Base): 
    __tablename__ = "inhalation_anesthesias" 
    id = Column(Integer, primary_key=True) 
    anesthetic = Column(String) 
    concentration = Column(Float) 
    concentration_unit = Column(String) 
    duration = Column(Float) 
    duration_unit = Column(String) 


class TwoStepInjectionAnesthesia(Base): 
    __tablename__ = "twostep_injection_anesthesias" 
    id = Column(Integer, primary_key=True) 
    anesthetic = Column(String) 
    solution_concentration = Column(Float) 
    solution_concentration_unit = Column(String) 
    primary_dose = Column(Float) 
    primary_rate = Column(Float) 
    primary_rate_unit = Column(String) 
    secondary_rate = Column(Float) 
    secondary_rate_unit = Column(String) 

class Operation(Base): 
    __tablename__ = "operations" 
    id = Column(Integer, primary_key=True) 
    anesthesia_id = Column(Integer, ForeignKey('inhalation_anesthesias.id')) 
    anesthesia = relationship("InhalationAnesthesia", backref="used_in_operations") 

मैं, हालांकि, इस तरह से है कि किसी भी Operation वस्तु के लिए या तो एक TwoStepInjectionAnesthesia वस्तु या एक InhalationAnesthesia वस्तु इंगित कर सकते हैं में Operation वर्ग के संवेदनाहारी विशेषता परिभाषित करना चाहते हैं।

मैं यह कैसे कर सकता हूं?

उत्तर

6

मैं आपको विरासत का उपयोग करने का सुझाव देता हूं। यह बहुत, बहुत अच्छी तरह से SQLAlchemy डॉक्स में विस्तार से बताया है here और here

मेरे सिफारिश एक Anesthesia वर्ग बना सकते हैं और इसे से दोनों InhalationAnesthesia और TwoStepInjectionAnesthesia इनहेरिट करना है। यह तालिका विरासत उपयोग किस प्रकार का फैसला करने के लिए अपने कॉल है:

  • एकल तालिका भाग
  • ठोस तालिका विरासत
  • में शामिल हो गए तालिका विरासत

विरासत का सबसे सामान्य रूप सिंगल हैं और तालिका में शामिल हो गए, जबकि ठोस विरासत अधिक विन्यास संबंधी चुनौतियों को प्रस्तुत करता है।


अपने मामले के लिए मैं कर रहा हूँ asuming में शामिल हो गए तालिका विरासत चुनाव है:

class Anesthesia(Base) 
    __tablename__ = 'anesthesias' 
    id = Column(Integer, primary_key=True) 
    anesthetic = Column(String) 
    # ... 
    # every common field goes here 
    # ... 
    discriminator = Column('type', String(50)) 
    __mapper_args__ = {'polymorphic_on': discriminator} 

discriminator क्षेत्र के प्रयोजन:

... कार्य करने के लिए है भेदभावकर्ता के रूप में, और स्टोर करता है जो एक मान जो पंक्ति के भीतर प्रदर्शित वस्तु के प्रकार को इंगित करता है। कॉलम किसी भी डेटाटाइप का हो सकता है, हालांकि स्ट्रिंग और पूर्णांक सबसे आम हैं।

__mapper_args__ के polymorphic_on कुंजी discriminator के रूप में जो क्षेत्र उपयोग परिभाषित करते हैं। बच्चों के वर्गों (नीचे) में, polymorphic_identity कुंजी उस मान को परिभाषित करती है जो कक्षा के उदाहरणों के लिए पॉलिमॉर्फिक भेदभाव कॉलम में संग्रहीत की जाएगी।

class InhalationAnesthesia(Anesthesia): 
    __tablename__ = 'inhalation_anesthesias' 
    __mapper_args__ = {'polymorphic_identity': 'inhalation'} 
    id = Column(Integer, ForeignKey('anesthesias.id'), primary_key=True) 
    # ... 
    # specific fields definition 
    # ... 


class TwoStepInjectionAnesthesia(Anesthesia): 
    __tablename__ = 'twostep_injection_anesthesias' 
    __mapper_args__ = {'polymorphic_identity': 'twostep_injection'} 
    id = Column(Integer, ForeignKey('anesthesias.id'), primary_key=True) 
    # ... 
    # specific fields definition 
    # ... 

अंत में Operation वर्ग एक ठेठ रिश्ते के साथ माता-पिता तालिका Anesthesia संदर्भ दे सकते हैं:

class Operation(Base): 
    __tablename__ = 'operations' 
    id = Column(Integer, primary_key=True) 
    anesthesia_id = Column(Integer, ForeignKey('anesthesias.id')) 
    anesthesia = relationship('Anesthesia', backref='used_in_operations') 

आशा यह आपके लिए क्या देख रहे है।

+0

तो इस सेट-अप का उपयोग करके मैं 'ऑपरेशन.एनेस्थेसिया' के तहत 'इनहेलेशन एनेस्थेसिया' और 'टूस्टेप इंजेक्शनएनेस्थेसिया' दोनों वस्तुओं को संदर्भित करने में सक्षम होना चाहिए? 'ऑपरेशन.एनेस्थेसिया = [टूस्टेप इंजेक्शनएनेस्थेसिया (..), इनहेलेशन एनेस्थेसिया (..), इनहेलेशनेशनस्थेसिया (..)] का उपयोग करना होगा 'कुछ भी गड़बड़ है? – TheChymera

+0

@TheChymera हां और हां। उदाहरण में एक 'ऑपरेशन' उदाहरण प्रदान किया जाएगा केवल एक 'संज्ञाहरण' वस्तु का संदर्भ देगा। यदि आपको इसकी सूची होने की आवश्यकता है तो आपको कोड को थोड़ा सा बदलना चाहिए। –

+0

एक और बात, उपरोक्त सेट-अप का उपयोग करने का क्या फायदा है (पायथन अंत में थोड़ा बेहतर व्यवस्थित होने के अलावा)? क्या उत्पन्न होने वाली वास्तविक एसक्यूएल तालिका में केवल कुछ डिस्कमैनेटर के साथ पंक्तियों के लिए कुछ स्तंभ प्रकार होते हैं? (जिससे डिस्क स्पेस बचाया जा सकता है?) – TheChymera