与多位父母一对多的关系

时间:2020-03-29 17:33:22

标签: python sql database flask sqlalchemy

与多位父母建立一对多关系的最佳方法是什么?例如,表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)

您知道更好的解决方案吗?我想念什么吗?

0 个答案:

没有答案
相关问题