Flask/SQLAlchemy - 多对多关系的关联模型和关联表之间的区别?

     2023-02-16     14

关键词:

【中文标题】Flask/SQLAlchemy - 多对多关系的关联模型和关联表之间的区别?【英文标题】:Flask/SQLAlchemy - Difference between association model and association table for many-to-many relationship? 【发布时间】:2015-08-05 01:45:29 【问题描述】:

我从 Flask Mega 教程开始学习这些东西。当他进入多对多关系时,他会创建一个如下所示的关联表:

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

这两种方法有什么区别?是需要model方法在关联表中存储元数据还是同样的事情可以用top方法来完成?

谢谢!

【问题讨论】:

【参考方案1】:

抱歉,我终于在 SQLAlchemy 文档中偶然发现了答案......

https://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#many-to-many

...他们明确定义了差异:

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 层,你可以只创建一个关联表。

【讨论】:

@oski86 不客气!对我来说,找出两者之间的差异是一个重要的时刻。这一切都在对象模式中extra_data列的应用中!如果您不需要绑定到特定模型对的额外数据,则不需要关联对象——更简单的关联表就足够了! @Chockomonkey 正在寻找这个。请为我清除这个。这会像现在“关联”和其他模型之间的一对多关系吗?在那种情况下,我们还必须在这些模型中定义关系吗?会有很大帮助。 @NewGuy 好问题,感谢提问!您发现我的回答乏善可陈,此后我用充实的关系字段对其进行了更新,并为清楚起见还添加了一些表定义。希望这会有所帮助! 更新文档链接:docs.sqlalchemy.org/en/latest/orm/… @user2682863 我今天调查了这个。文档表明 backref 在这种情况下是合法使用的,实际上最终会调用 back_populates 本身。它是一种简写,因为当在 Association 对象中的关系定义中使用 backref 时,它不需要在 LeftRight 模型中显式定义关系。有人可能会争辩说显式更好,但实际上两者都可以。

Flask SQLAlchemy 多对多关联对象错误

】FlaskSQLAlchemy多对多关联对象错误【英文标题】:FlaskSQLAlchemyManytoManyassociationobjecterror【发布时间】:2017-08-3017:43:59【问题描述】:我正在使用基于项目管理的python3.4、Flask和SQLAlchemy进行项目。我有以下需要以多对多关系相互链... 查看详情

Flask SQLAlchemy 多对多插入重复条目

】FlaskSQLAlchemy多对多插入重复条目【英文标题】:FlaskSQLAlchemyManyToManyInsertDuplicatesEntries【发布时间】:2016-03-0806:33:14【问题描述】:我创建了一个Flask-SQLAlchemyAPI,其中包含项与标签的多对多关系。一个简单的添加没有问题(在... 查看详情

Flask sqlalchemy 多对多插入数据

】Flasksqlalchemy多对多插入数据【英文标题】:Flasksqlalchemymany-to-manyinsertdata【发布时间】:2014-10-2908:34:37【问题描述】:我试图在Flask-SQLAlchemy中建立多对多关系,但似乎我不知道如何填写“多对多标识符数据库”。你能帮我理解... 查看详情

Flask SQLAlchemy NOT NULL 约束在主键上失败

】FlaskSQLAlchemyNOTNULL约束在主键上失败【英文标题】:FlaskSQLAlchemyNOTNULLconstraintfailedonprimarykey【发布时间】:2016-04-0712:28:43【问题描述】:我正在尝试在SQLite中创建一个数据库,该数据库有两个表,一个用于机场列表,另一个用于... 查看详情

(转)hibernate框架基础——多对多关联关系映射

http://blog.csdn.net/yerenyuan_pku/article/details/52756536多对多关联关系映射多对多的实体关系模型也是很常见的,比如学生和课程的关系。一个学生可以选修多门课程,一个课程可以被多名学生选修。在关系型数据库中对于多对多关联关... 查看详情

具有额外多对多关系的 JPA 多对多

】具有额外多对多关系的JPA多对多【英文标题】:JPAManyToManywithextraManyToManyrelation【发布时间】:2019-09-1910:39:18【问题描述】:我需要支持涉及以下实体的场景(使用JPA):用户帐户角色一个用户可以有多个帐户,一个帐户可以... 查看详情

雄辩的多对多对多 - 如何轻松加载远距离关系

】雄辩的多对多对多-如何轻松加载远距离关系【英文标题】:Eloquentmany-to-many-to-many-howtoloaddistantrelationeasily【发布时间】:2014-11-2823:45:27【问题描述】:我有3张桌子;用户、组和权限在模型中,我将关系设置为belongsToMany在用户... 查看详情

hibernate的多对多关联关系

一、概述多对多关联关系在java对象中可以通过定义集合类型来实现关联关系。在关系数据模型中,无法直接表达表和表之间的多对多关联关系,而是需要创建一个中间表包含了两边的主键,来表达两张表的多对多关联关系。实... 查看详情

关联映射----hibernate之多对多关系

叙:上一章详细的记录了关联映射中的“一对多|多对一”关系、级联操作、关系的维护等知识点,本章节轻风学习记录的是级联关系中的“多对多”关系;Hibernate的“多对多”级联关系1.介绍在生活中很多关系都是多对多的,比... 查看详情

过滤多对多关系中的选择

】过滤多对多关系中的选择【英文标题】:Filteringchoicesinmanytomanyrelationship【发布时间】:2018-04-1319:59:57【问题描述】:今天我在MSAccess2013中遇到了多对多关系的问题。我用连接表建立了多对多关系,效果很好,但我试图根据多... 查看详情

“多对多”关系的同义词(关系数据库)

】“多对多”关系的同义词(关系数据库)【英文标题】:Synonymfor"Many-to-Many"relationship(relationaldatabases)【发布时间】:2010-04-2806:11:20【问题描述】:“多对多”关系的同义词是什么?我已经完成了一个对象关系映射器的... 查看详情

多对多持有关系信息

】多对多持有关系信息【英文标题】:Many-to-manyholdinginformationaboutarelationship【发布时间】:2011-05-1916:45:26【问题描述】:在ORM(无偏好)中,当我们需要保存有关这种关系的信息时,如何最好地表示两个模型之间的多对多关系?... 查看详情

多对多关系的jpa标准

】多对多关系的jpa标准【英文标题】:jpacriteriaformanytomanyrelationship【发布时间】:2011-12-2910:53:49【问题描述】:我在Java中有2个POJO类,Answer和Collaborator,它们是多对多关系。classAnswer@ManyToMany(cascade=CascadeType.ALL)@JoinTable(name="ANSWERS_... 查看详情

跨多对多表的关系

】跨多对多表的关系【英文标题】:Relationshipacrossamany-to-manytable【发布时间】:2014-10-1320:25:34【问题描述】:我想跨多对多表创建关系,User具有Roles,而Project具有Project。我想在User中与所有与其Roles相关的Projects建立关系。我对pr... 查看详情

Laravel 4:具有额外关系的多对多

】Laravel4:具有额外关系的多对多【英文标题】:Laravel4:ManytoManywithextrarelationship【发布时间】:2013-11-1422:42:27【问题描述】:我遇到了Laravel4和“多对多”查询关系的问题。我有四张桌子:用户需要货币user_needsUser_Needs包含用户... 查看详情

两个以上具有多对多关系的表[重复]

】两个以上具有多对多关系的表[重复]【英文标题】:Morethantwotableswithmanytomanyrelationship[duplicate]【发布时间】:2019-12-2910:15:56【问题描述】:我在SQLServer中有三个表,它们之间的关系是多对多的,但我不知道哪个是正确的关系。... 查看详情

Postgresql 多对多关系插入

】Postgresql多对多关系插入【英文标题】:PostgresqlManytoManyrelationshipinsert【发布时间】:2014-08-0705:08:45【问题描述】:我使用的是Postresql9.3.5。我在实体“Foo”和“Bar”之间有一个多对多的关系,我将其建模为:CREATETABLEFoo(idSERIALPR... 查看详情

SQLAlchemy如何反映多对多关系

】SQLAlchemy如何反映多对多关系【英文标题】:SQLAlchemyhowtoreflectmany-to-manyrelationships【发布时间】:2021-07-2212:09:47【问题描述】:我有两个具有多对多关系的现有表。我正在尝试从这些表中查询,但似乎我无法反映它们的多对多关... 查看详情