Python 3.x 炼金术和棉花糖的多对多关系

Python 3.x 炼金术和棉花糖的多对多关系,python-3.x,flask,sqlalchemy,flask-sqlalchemy,flask-marshmallow,Python 3.x,Flask,Sqlalchemy,Flask Sqlalchemy,Flask Marshmallow,假设我有两个表,表1由用户信息组成,表2由分支信息组成。 表1和表2通过多对多关系相互关联。 e、 G1用户可以在多个分支机构工作,并且一个分支机构可以有多个用户。 所以这里没有亲子概念。我想知道我是否必须用schema创建另一个表,并使用外键将其与user和branch表关联,还是应该创建一个关联表 我已经这样做了: class UserBranchMap(db.Model): id = db.Column(db.Integer, primary_key=True) branc

假设我有两个表,表1由用户信息组成,表2由分支信息组成。 表1和表2通过多对多关系相互关联。 e、 G1用户可以在多个分支机构工作,并且一个分支机构可以有多个用户。 所以这里没有亲子概念。我想知道我是否必须用schema创建另一个表,并使用外键将其与user和branch表关联,还是应该创建一个关联表

我已经这样做了:

class UserBranchMap(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    branch_id = db.Column(db.Integer,db.ForeignKey('branch.id'))
    branch = db.relationship("Branch", backref=db.backref("UBMbranch", lazy="dynamic"))
    user_id = db.Column(db.Integer,db.ForeignKey('user.id'))
    user = db.relationship("User", backref=db.backref("UBMuser", lazy="dynamic"))
    created_at = db.Column(db.VARCHAR(20), nullable = False)
    created_by = db.Column(db.VARCHAR(20), nullable = False)

class UserBranchMapSchema(ma.Schema):
    branch = fields.Nested(branch_schema)
    user = fields.Nested(user_schema)
    class Meta:
        fields = ('branch_id','user_id','created_at','created_by')

userbranchmap_schema = UserBranchMapSchema()
userbranchmaps_schema = UserBranchMapSchema(many = True)

关联表和映射表之间的区别是什么?

如果我理解正确,您是在询问关联表之间的区别

userbranchs=db.Table(
“用户分支机构”,
db.Column('user\u id',db.Integer,db.ForeignKey('user.id'),primary\u key=True),
db.Column('branch\u id',db.Integer,db.ForeignKey('branch.id'),primary\u key=True)
)
和一个映射表

类用户分支(db.Model):
id=db.Column(db.Integer,主键=True)
user=db.relationship(“user”,backref=db.backref(“UBMuser”,lazy=“dynamic”))
user\u id=db.Column(db.Integer,db.ForeignKey('user.id'))
branch=db.relationship(“branch”,backref=db.backref(“UBMbranch”,lazy=“dynamic”))
branch_id=db.Column(db.Integer,db.ForeignKey('branch.id'))
在数据库级别上,它们之间没有真正的区别。如果您只想在两个表之间建立严格的多对多关系,只需使用关联表即可。由于SQLAlchemy,您永远不必对它做任何事情,因为只要您将用户加入到分支或相反的分支,通过该表的连接就会自动发生


但是,如果您想做更多的工作,比如让它实际表示一个关系,那么映射表就像您编写的那样,因为它的行为与普通表完全相同。这意味着您可以像
UserBranch.created\u那样使用它,如果您愿意,甚至可以直接查询它。

我想从用户和分支中删除一个分支。基本上,我想对映射表执行插入和删除操作。所以我想知道哪一个在SQL术语中更有效,这无关紧要。只要具有相同的列,就会生成相同的SQL。如果你真的非常关心性能,那就顺其自然吧,因为在这两种情况下,ORM的开销最大。