架构两对多关系(例如,有母亲和父亲的孩子)

时间:2014-05-12 13:48:51

标签: sqlalchemy relational-database flask-sqlalchemy

我正在尝试设计一个架构,用于在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 )

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

谢谢!

1 个答案:

答案 0 :(得分:2)

只是一个建议:既然你将'母亲'和'父亲'与'父母'分开,我认为你最好避免多对多的关系。相反,一对多的关系似乎更好。课程应该是这样的:

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'))
    ...