Flask / SQLAlchemy - разница между моделью ассоциации и таблицей ассоциаций для отношений "многие ко многим"?

Я начал изучать этот материал из фляжки Mega Tutorial. Когда он вступает в отношения "многие ко многим", он создает таблицу ассоциаций, подобную этой:

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

когда я искал способы добавить некоторые метаданные относительно конкретной связи между моделями, я обнаружил, что вы можете сохранить эту вещь в таблице ассоциаций.. Однако пример этого, который я нашел, похоже, делает таблицу ассоциаций реальной моделью.

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

в чем разница между этими двумя методами? Требуется ли метод модели для хранения метаданных в таблице ассоциаций или то же самое можно сделать с методом top?

спасибо!

1 ответов


мои извинения, я, наконец, наткнулся на ответ в документах SQLAlchemy...

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

...где они явно определяют разницу:

многие ко многим добавляет таблицу ассоциаций между двумя классами.

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

шаблон объекта ассоциации является вариантом для многих-ко-многим: он используется когда ваша ассоциация таблица содержит дополнительные столбцы помимо этих которые являются внешними ключами для левой и правой таблиц. Вместо использования вторичный аргумент, вы сопоставляете новый класс непосредственно с таблица ассоциаций.

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

таким образом, это в основном создание объекта для ссылки на эту дополнительную информацию, если вам нужно сохранить что-либо в таблице ассоциаций, иначе нет необходимости использовать слой ORM, и вы можете просто создать таблицу.