【问题标题】:Schema two-to-many relation (e.g. Child with Mother and Father)架构二对多关系(例如,孩子与母亲和父亲)
【发布时间】:2014-05-15 15:26:31
【问题描述】:

我正在尝试设计一个模式来表示在 SQLAlchemy 中具有父母和孩子的家庭。父母可以与许多孩子相关,每个孩子恰好有两个父母,父亲和母亲。我可以通过使用多对多关系来做类似的事情。

family_table = db.Table('family', db.metadata,
    db.Column('parent_id', db.Integer, db.ForeignKey('parent.id')),
    db.Column('child_id', db.Integer, db.ForeignKey('child.id'))
    )

class Parent(db.Model):
    id = db.Column( db.Integer, primary_key = True )
    children = db.relationship( 'Child', secondary = family_table, backref = 'parents' )

class Child(db.Model):
    id = db.Column( db.Integer, primary_key = True )

但是,由于这允许一个孩子有两个以上的父母,因此并不令人满意。相反,我尝试手动指定从孩子到父亲和母亲的单向关系:

class Child(db.Model):
    id = db.Column( db.Integer, primary_key = True )
    father_id = db.Column( db.Integer, db.ForeignKey('parent.id'))
    father = db.relationship( 'Parent', foreign_keys = father_id )
    mother_id = db.Column( db.Integer, db.ForeignKey('parent.id'))
    mother = db.relationship( 'Parent', foreign_keys = mother_id )

我的问题:如何定义从父级到子级的关系(例如,父表中的子列)?

谢谢!

【问题讨论】:

    标签: sqlalchemy relational-database flask-sqlalchemy


    【解决方案1】:

    只是一个建议:由于您将“母亲”和“父亲”与“父母”分开,我认为您最好避免多对多关系。相反,一对多的关系似乎更好。类应该是这样的:

    class Mother(db.Model):
        id = ...
        children = db.relationship('Child', backref='mother', lazy='dynamic')
        ...
    class Father(db.Model):
        id = ...
        children = db.relationship('Child', backref='father', lazy='dynamic')
        ...
    class Child(db.Model):
        ...
        id = db.Column(db.Integer, primary_key = True)
        father_id = db.Column(db.Integer, db.ForeignKey('father.id'))
        mother_id = db.Column(db.Integer, db.ForeignKey('mother.id'))
        ...
    

    【讨论】:

    • 谢谢!这正是我想要的。
    • @onkel 很好,如果您可以点击“支持”,那就太好了! ;)
    猜你喜欢
    • 2021-10-22
    • 2012-05-07
    • 1970-01-01
    • 2012-05-04
    • 2013-03-09
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    相关资源
    最近更新 更多