Выполнение глубоких вложенных отношений между родителями и детьми с помощью FeathersJS - PullRequest
1 голос
/ 29 мая 2019

Мне интересно, как лучше всего установить глубокие вложенные родительские отношения между родителями, используя рекомендуемый метод ассоциации Feathers?

Если бы мои записи были:

[
    {"name": "Grandpa", "id": 1, "parent": null},
    {"name": "Mom", "id":2, "parent": 1},
    {"name": "Baby", "id": 3, "parent": 2}
]

Затем, если бы я хотел найти верхний родительский элемент дерева, я выполнял бы рекурсивное получение, пока не достигну вершины дерева:

const family = app.service('/family')
function get_ancestors(childId, parents){
    const child = family.get(childId)
    if(child.parent){
        parents.push(child.parent)
        return get_ancestors(child.parent, parents)
    } else {
        return parents
    }
}

Но это кажется мне неуклюжим и не очень расширяемым.Есть ли способ лучше?Это похоже на то, что fastJoin сделает, но это не относится к «рекомендуемому» подходу к созданию ассоциаций.Я также не вижу примеров более 3-х уровней в руководстве, за исключением, возможно, пакетных загрузчиков, И это выглядит немного сложнее, чем нам нужно здесь.Каков «рекомендуемый» способ обхода дерева предков с помощью Перьев?И наоборот, если бы у меня был дедушка, как бы я нашел ребенка?Должны ли мои записи содержать массив «children», который заполняется при добавлении потомка в качестве родителя?Или есть лучший способ перехода от верха к низу родительского дерева?

1 Ответ

1 голос
/ 30 мая 2019

То, что сводится к тому, что Feathers - это , а не - ORM, поэтому обработка ассоциаций во многом зависит от базы данных и ORM, которые вы выбрали, примерно так же, как и для других сред, таких как Express или KoaJS.Это означает большую гибкость, но также и то, что на самом деле не существует единственно верного способа сделать это, и связанная ссылка FAQ пытается охватить различные варианты как можно лучше.

fastJoin поддерживает вложенные ассоциации, но можетбудет медленнее, если вы используете базу данных SQL, где ORM может обрабатывать оптимизацию запросов (Sequelize также поддерживает вложенные включения).Но это может быть быстрее, чем Mongoose $populate.Проведите несколько экспериментов, чтобы увидеть, какой из них работает лучше всего.Что касается отношений между родителями и детьми, то нужно обратить внимание на циклические зависимости, поэтому вы хотите использовать то, что может с этим справиться.

...