与多位父母建立一对多关系的最佳方法是什么?例如,表Post和Picture与表Comment都具有一对多关系。我尝试了多种解决方案,但没有一种感觉正确。
最简单的解决方案是复制子表。但这也是最糟糕的解决方案:修改Child表需要修改所有Child表。
class Parent_A(db.Model):
__tablename__ = 'parent_a'
id = db.Column(db.Integer, primary_key=True)
children = db.relationship("Child_A")
class Child_A(db.Model):
__tablename__ = 'child_a'
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('parent_a.id'))
class Parent_B(db.Model):
__tablename__ = 'parent_b'
id = db.Column(db.Integer, primary_key=True)
children = db.relationship("Child_B")
class Child_B(db.Model):
__tablename__ = 'child_b'
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('parent_b.id'))
我认为最糟糕的解决方案是为每个父类使用关系表。
relation_A = db.Table('relation_a',
db.Column('parent_a_id', db.Integer, db.ForeignKey('parent_a.id')),
db.Column('child', db.Integer, db.ForeignKey('child.id'))
)
relation_B = db.Table('relation_b',
db.Column('parent_b_id', db.Integer, db.ForeignKey('parent_b.id')),
db.Column('child', db.Integer, db.ForeignKey('child.id'))
)
class Parent_A(db.Model):
__tablename__ = 'parent_a'
id = db.Column(db.Integer, primary_key=True)
children = db.relationship('Child', secondary='relation_a')
class Parent_B(db.Model):
__tablename__ = 'parent_b'
id = db.Column(db.Integer, primary_key=True)
children = db.relationship('Child', secondary='relation_b')
class Child(db.Model):
id = db.Column(db.Integer, primary_key=True)
另一种选择是为每个父级使用一个主子表和一个中间子表。
class Parent_A(db.Model):
__tablename__ = 'parent_a'
id = db.Column(db.Integer, primary_key=True)
children = db.relationship("Child_A")
class Parent_B(db.Model):
__tablename__ = 'parent_b'
id = db.Column(db.Integer, primary_key=True)
children = db.relationship("Child_B")
class Child_A(db.Model):
__tablename__ = 'child_a'
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('parent_a.id'))
child_id = db.Column(db.Integer(), db.ForeignKey('child.id'))
class Child_B(db.Model):
__tablename__ = 'child_b'
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('parent_b.id'))
child_id = db.Column(db.Integer(), db.ForeignKey('child.id'))
class Child(db.Model):
id = db.Column(db.Integer, primary_key=True)
您知道更好的解决方案吗?我想念什么吗?