SQLALCHEMY - много-много-много унарных отношений - PullRequest
0 голосов
/ 02 июня 2018

У меня есть таблица под названием Node.У каждого узла есть много потомков типа Node.Кроме того, объект Node имеет много родителей.Я также сделал алгоритм, чтобы найти братьев и сестер (узел с похожими родителями)

, как это сделать?сделать для них отдельную таблицу?или мне сделать это в той же таблице?вот как я пытался это сделать и потерпел неудачу:

class Node(Model):
    id = Column(String, primary_key=True)
    name = Column(String)
    parent_id = db.Column(db.String, db.ForeignKey('node.id'))

    children = db.relationship('node', remote_side=[id], uselist=True)
    parents = db.relationship('node', remote_side=[id], uselist=True)
    siblings = db.relationship('node', remote_side=[id], uselist=True)

Я понятия не имею, как это сделать.

Я действительно думал об использовании graphDB для этого объекта узла.И другие таблицы с классическим SQL, но я не уверен, что это стоит суеты

1 Ответ

0 голосов
/ 02 июня 2018

Хотя я пока не знаю, как реализовать «братьев и сестер», вот как можно иметь много самореферентных отношений «многие ко многим»:

Connection = Table('connection',
    Column('child_id', String, ForeignKey('node.id')),
    Column('parent_id', String, ForeignKey('node.id')),
    UniqueConstraint('parent_id', 'child_id', name='unique_usage')
)


class Node(Model):
    id = Column(String, primary_key=True)
    name = Column(String)

    # this is the result list of type Node 
    # where the current node is the "other party" or "child"
    parents = relationship('Node', secondary=Connection, 
                            primaryjoin=id == Connection.c.parent_id,
                            secondaryjoin=id == Connection.c.child_id)

    # this is the result list of type Node 
    # where the current node is the "parent" 
    children = relationship('Node', secondary=Connection, 
                            primaryjoin=id == Connection.c.child_id,
                            secondaryjoin=id == Connection.c.parent_id)

в основном, для каждого желаемого «многие к»-много отношения, создайте таблицу, представляющую отношение, затем добавьте отношение к вашему модулю.Вы можете иметь двусторонние отношения для каждого из них

Я отредактирую свой ответ позже, когда пойму, как сделать братьев и сестер

...