Каков наилучший способ реализации отношений «один ко многим» с несколькими родителями? Например, таблицы Post и Picture будут иметь отношение один ко многим с таблицей Comment. Я пробовал несколько решений, но ни одно из них не показалось правильным.
Несколько дочерних таблиц
Самое простое решение - дублировать дочерние таблицы. Но это также худшее решение: изменение дочерней таблицы требует изменения всех дочерних таблиц.
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)
Знаете ли вы о лучшем решении? Я что-то упустил?