Основываясь на комментариях @ philipxy, лучшим способом продвижения вперед является ответ на мой собственный вопрос, и, возможно, другие могут ответить на него лучше.
ORM позволяет вам объявлять отношения и методы для получения результатов запросов связанных сущностей, но запрос, выполняемый ORM, специфичен для магазина, и именно здесь он будет сделан "более эффективным".В хранилище SQL разработчик обычно не задумывается об этом, ORM просто запустит, например, select * from children where parentId = 2
, и хранилище сделает это эффективным.
Похоже, у вас есть хранилище объектов javascript.Если производительность не является реальной проблемой, children.filter({ parentId }) === parent.id
является подходом, используемым redux-orm
, и, скорее всего, будет адекватным, учитывая скорость современных браузеров.
Для хранилищ SQL, вероятно, существуют гораздо более низкоуровневые подходы к оптимизации таких запросов.Например, если все дочерние элементы были отсортированы по parentId, можно использовать более эффективные алгоритмы, чем O (n).Некоторые такие подходы могут также применяться к хранилищам объектов javascript.
Другими словами, использование parentId в дочерней модели приводит к проблеме фильтрации при переходе от 1 к множеству.
Вы также упомянули тот факт, что вы можете представлять отношение 1-много, когда у родителя есть дочерние идентификаторы.Учитывая, что в этом случае вы все равно столкнетесь с проблемой фильтрации, если захотите перейти от дочернего элемента к родительскому (найдите родительского элемента, у которого один из его дочерних элементов имеет идентификатор дочернего элемента, который вы ищете), если только по какой-то причине вы не планируетепереходите от родителей к детям очень часто, но не наоборот, это, вероятно, менее целесообразно.Это не очень хорошо подходит для деловых проблем, когда ребенок не существует без родителя, например, комментарий к сообщению, потому что для сохранения отношений таким образом ребенок должен существовать первым.
Короче говоря, цикл O (n) для реализации метода 1-много займет большое n, чтобы стать узким местом производительности, и если это так, есть другие подходы фильтрации, которые меньше, чем O (n),Вы можете изучить алгоритмы фильтрации CS, чтобы понять это дальше.Также, если вы реализуете свой магазин, многие опции действительны, это зависит только от вашего конкретного случая.SQL обычно абстрагирует используемые алгоритмы, но если вы реализуете свое собственное хранилище, вам нужно подумать об этом более тщательно, основываясь на ваших случаях.