Ответ 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))
left = relationship('Left', backref=backref('right_association'))
right = relationship('Right', backref=backref('left_association'))
Где "Right" и "Left" - таблицы, определяемые обычно:
class Left(Base):
__tablename__ = 'left'
id = Column(Integer, primary_key = True)
...
class Right(Base):
__tablename__ = 'right'
id = Column(Integer, primary_key = True)
...
Таким образом, это в основном создание объекта ассоциации для ссылки на эту дополнительную информацию, если вам нужно сохранить что-либо в ассоциации, в противном случае нет необходимости использовать слой ORM, и вы можете просто создать таблицу ассоциации.