Отношения один-ко-многим с несколькими родителями - PullRequest
0 голосов
/ 29 марта 2020

Каков наилучший способ реализации отношений «один ко многим» с несколькими родителями? Например, таблицы 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)

Знаете ли вы о лучшем решении? Я что-то упустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...