Мне интересно, какой лучший способ сделать глубокие вложенные родительско-дочерние отношения - это использовать 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
}
}
Но это кажется мне неуклюжим и не очень расширяемым. Есть ли способ лучше? Кажется, что это может сделать быстроПрисоединяйтесь, но это не относится к «Рекомендуемым» подходам к созданию ассоциаций. Я также не вижу примеров более 3 уровней в руководстве, за исключением, может быть, порционные загрузчики, И это выглядит немного сложнее, чем нам здесь нужно. Каков «рекомендуемый» способ обхода дерева предков с использованием Feathers? И наоборот, если бы у меня был дедушка, как бы я нашел Малыша? Должны ли мои записи содержать массив «детей», который заполняется, когда ребенок добавляется к ним в качестве родителя? Или есть лучший способ перейти от вершины к основанию родительского дерева?
Все сводится к тому, что Feathers — это нет ORM, поэтому обработка ассоциаций во многом зависит от базы данных и выбранной вами ORM почти так же, как и в других фреймворках, таких как Express или KoaJS. Это означает большую гибкость, но также и то, что на самом деле нет единственно правильного способа сделать это, и связанная запись часто задаваемых вопросов пытается максимально полно охватить различные варианты.
fastJoin
поддерживает вложенные ассоциации, но может быть медленнее, если вы используете базу данных SQL, где ORM может обрабатывать оптимизацию запросов (Sequelize также поддерживает вложенные включения). Но это может быть быстрее, чем Mongoose $populate
. Проведите несколько экспериментов, чтобы увидеть, какой из них работает лучше всего. С отношениями родитель/потомок нужно обращать внимание на круговые зависимости, поэтому вы хотите использовать что-то, что может справиться с этим.
Они также всегда имеют оба связанных объекта модели Sequelize в одном документе. Мне просто импортировать экспортированный объект из другого файла service.model.js и использовать его? Если я использую идентификаторы из той же модели, нужно ли просто передать имя текущей модели в качестве имени модели?
Функция ассоциирования вызывается при запуске приложения. Он вызывается при запуске приложения и по этой причине имеет model
в качестве аргумента, чтобы мы могли избежать циклического включения. Вы можете использовать models.myModel
в этом методе, чтобы определить ассоциацию.
Когда я использую ptestModel1.hasMany(models['ptestModel2']) в ассоциированной функции в файле ptestModel1.model.js, я получаю сбой, который происходит в ассоциированной функции, но без текста ошибки, просто начинается трассировка в Object.keys(models).forEach. Эта ошибка возникает, если я делаю вышеуказанное в файле ptestModel1 model.js и в файле ptestModel2.model.js, если я пишу ptestModel2.belongsTo(model['ptestModel1']). Я пробовал с и без продолжения.sync({force: true}), и сбой все равно произошел. Вы знаете, что может быть причиной аварии?
В src/models/my_service.model.js для службы Sequelize я вижу в комментариях docs.sequelizejs.com/en/latest/docs/associations. Итак, я просто настроил ассоциацию, а затем в будущих вызовах GET Sequelize будет заполнять родительские поля данными? Проблема в том, что в приведенной выше документации не говорится о функции .associate, вместо этого она выглядит так, как будто они передают модель, в которой передаются хуки, а затем вызывают другую функцию, например .belongsTo.