2017-12-27 6 views
0

Unten finden Sie die Dokumentation von sqlalchemy.Warum werden die Fremdschlüssel in einem SQLAlchemy-Zuordnungsobjekt als Primärschlüssel markiert?

Beachten Sie, wie für left_id und right_id in der Vereinigung der Klasse, sie sind zunächst als ForeignKey markiert und dann primary_key = True

Es macht Sinn für mich, dass sie Fremdschlüssel sein sollte, weil logisch sie Fremdschlüssel das sind andere zwei Eltern- und Kindtabellen.

Also, was ist der Zweck, sie Primärschlüssel auch zu haben?

Was geht hier vor? Bitte erkläre.

class Association(Base): 
    __tablename__ = 'association' 
    left_id = Column(Integer, ForeignKey('left.id'), primary_key=True) 
    right_id = Column(Integer, ForeignKey('right.id'), primary_key=True) 
    extra_data = Column(String(50)) 
    child = relationship("Child", back_populates="parents") 
    parent = relationship("Parent", back_populates="children") 

class Parent(Base): 
    __tablename__ = 'left' 
    id = Column(Integer, primary_key=True) 
    children = relationship("Association", back_populates="parent") 

class Child(Base): 
    __tablename__ = 'right' 
    id = Column(Integer, primary_key=True) 
    parents = relationship("Association", back_populates="child") 

Antwort

0

Dies ist nicht einzigartig für SQLAlchemy. So werden many-to-many relationships entworfen, die auf den Prinzipien des relationalen Datenbankdesigns basieren.

In einer Viele-zu-Viele-Beziehung ist eine zusätzliche Tabelle erforderlich, auch Zuordnungstabelle genannt, die Einträge aus der ersten Tabelle den entsprechenden Einträgen aus der zweiten Tabelle zuordnet.

Wenn die Zuordnungstabelle definiert ist, benötigen wir einen Primärschlüssel, um Datensätze in der Zuordnungstabelle eindeutig zu identifizieren. Wenn Sie einen Primärschlüssel verwenden, wird ein Index erstellt, der die Verbindungsvorgänge und die Suche nach Datensätzen beschleunigt.

Also, warum haben alle Fremdschlüssel als Teil der Primär für die Zuordnungstabelle? Damit wird sichergestellt, dass keine doppelten Einträge des Datensatzes a von table A und b von Table B vorliegen. Mit anderen Worten, um Einzigartigkeit in der Beziehung zu gewährleisten und somit Doppelbeziehungen zu vermeiden.

Assoziationstabelle kann erstellt werden, ohne dass die Fremdschlüssel als Primärschlüssel deklariert werden. Aber das ist nicht ratsam. Dadurch werden die Join-Operationen langsam, wenn Indizes nicht explizit erstellt werden. Und es besteht eine gute Chance, doppelte Aufzeichnungen einer Beziehung zwischen Table A und Table B

zu haben
Verwandte Themen