Подтвердить что ты не робот

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

Я начал изучать этот материал из Flask 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"))

В чем разница между этими двумя методами? Является ли метод модели обязательным для хранения метаданных в таблице ассоциаций или может быть выполнено то же самое с помощью верхнего метода?

Спасибо!

4b9b3361

Ответ 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, и вы можете просто создать таблицу ассоциации.