【问题标题】:Many to Many relationship Flask sqlalchemy and marshmallow多对多关系烧瓶sqlalchemy和棉花糖
【发布时间】:2020-11-21 23:47:42
【问题描述】:

假设我有 2 个表,表 1 包含用户信息,表 2 包含分支信息。 表 1 和表 2 以多对多的关系相互关联。 例如,1 个用户可以在多个分支工作,1 个分支可以有多个用户。 所以这里没有父子概念。我想知道是否必须使用架构创建另一个表并使用外键将其与用户和分支表相关联,或者我应该创建一个关联表。

我已经这样做了:

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)

关联表和这个映射表有什么区别?

【问题讨论】:

    标签: python-3.x flask sqlalchemy flask-sqlalchemy flask-marshmallow


    【解决方案1】:

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

    UserBranches = db.Table(
        'user_branches',
        db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
        db.Column('branch_id', db.Integer, db.ForeignKey('branch.id'), primary_key=True)
    )
    

    还有一个映射表

    class UserBranch(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        user = db.relationship("User", backref=db.backref("UBMuser", lazy="dynamic"))
        user_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_at 一样使用它,甚至可以根据需要直接查询。

    【讨论】:

    • 我想从一个用户中删除一个分支,从一个分支中删除一个用户。基本上我想对映射表进行插入和删除操作。所以我想知道哪个效率更高
    • 用 SQL 术语来说,这无关紧要。只要有相同的列,就会生成相同的 SQL。如果您真的非常关心性能,请采用SQLAlchemy CORE 方式,因为在这两种情况下,开销最大的是 ORM。
    猜你喜欢
    • 2020-01-29
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2021-12-14
    • 2020-09-23
    • 1970-01-01
    相关资源
    最近更新 更多