5

Ho iniziato a imparare questa roba dal Flask Mega Tutorial. Quando arriva in molti-a-molti, egli crea una tabella di associazione come questa:Flask/SQLAlchemy - Differenza tra modello di associazione e tabella di associazione per la relazione molti-a-molti?

followers = db.Table('followers', 
    db.Column('follower_id', db.Integer, db.ForeignKey('user.id')), 
    db.Column('followed_id', db.Integer, db.ForeignKey('user.id')) 
) 

Mentre ero alla ricerca di modi per aggiungere alcuni metadati per quanto riguarda una specifica associazione tra modelli, ho scoperto che è possibile memorizzare questo qualcosa di simile nella tabella di associazione. Tuttavia l'esempio di ciò che ho trovato sembra rendere la tabella di associazione un modello reale.

class DepartmentEmployeeLink(Base): 
    __tablename__ = 'department_employee_link' 
    department_id = Column(Integer, ForeignKey('department.id'), primary_key=True) 
    employee_id = Column(Integer, ForeignKey('employee.id'), primary_key=True) 
    extra_data = Column(String(256)) 
    department = relationship(Department, backref=backref("employee_assoc")) 
    employee = relationship(Employee, backref=backref("department_assoc")) 

Qual è la differenza tra questi due metodi? Il metodo del modello è necessario per memorizzare i metadati nella tabella di associazione o la stessa cosa può essere eseguita con il metodo top?

Grazie!

risposta

7

Le mie scuse, ho finalmente imbattuti la risposta nella documentazione SQLAlchemy ...

http://docs.sqlalchemy.org/en/rel_1_0/orm/basic_relationships.html#many-to-many

... dove si definiscono in modo esplicito la differenza:

molti a molti aggiunge un tabella di associazione tra due classi.

association_table = Table('association', Base.metadata, 
    Column('left_id', Integer, ForeignKey('left.id')), 
    Column('right_id', Integer, ForeignKey('right.id')) 
) 

Il modello oggetto associazione è una variante su molti-a-molti: è utilizzato quando la tabella di associazione contiene colonne aggiuntive oltre a quelle che sono chiavi esterne alle tabelle di destra e di sinistra. Invece di utilizzare l'argomento secondario , si associa una nuova classe direttamente alla tabella di associazione .

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") 

quindi è fondamentalmente la creazione di un oggetto fare riferimento a queste informazioni supplementari, se avete bisogno di memorizzare qualsiasi cosa nella tabella di associazione, in caso contrario non è necessario utilizzare il livello ORM e si può solo creare una tabella.

Problemi correlati