В моей базе данных самый эффективный способ сохранить древовидную структуру - это поместить дочерний элемент в качестве ключа и его родительский элемент в качестве значения:
database: {
"cars": "objects",
"objects": false,
"electronics": "objects",
"Honda": "cars",
"BMW": "cars,
"Samsung": "electronics",
"Apple": "electronics"
}
База данных может содержать тысячи детей.
Но мне они нужны в обратном порядке, поэтому:
reversed: {
"objects": ["electronics", "cars"],
"electronics": ["Samsung", "Apple"],
"Samsung": [],
"Apple": [],
"cars": ["Honda", "BMW"],
"Honda": [],
"BMW": []
}
Каждый элемент списка будет элементом JSX и будет отображаться сам, так как он является рекурсивным (например, если state.elements имеет вышеуказанную структуру).
const mapStateToProps = (state, ownProps) => {
const children = state.elements[ownProps.id];
return { children };
}
Если я сохраню нормализованные данные в redux и обработаю их внутри mapStateToProps, если у нас есть тысячи элементов, они будут обработаны внутри mapStateToProps тысячу раз, что я не считаю эффективным даже с селекторами.
Мы можем получить уже обработанный ответ в обратном порядке, но это вызовет проблему. Если мы хотим изменить родительский элемент, ему потребуется получить текущий родительский элемент, отфильтровать его дочерние элементы, чтобы исключить целевой элемент, и передать его новому родительскому элементу.
В нормализованной структуре нам просто нужно сослаться на дочерний идентификатор и установить его значение в качестве нового родителя. Таким образом, изменение данных намного проще в нормализованной структуре, но лучше работать с ними в обратной структуре.
Итак, есть три способа (по моему мнению):
- хранить обе структуры в редуксе (и редуктор меняет направление)
- сохранить нормализованную структуру в редуксе и перевернуть ее в mapStateToProps
- хранить только перевернутые данные и при изменении преобразовывать их обратно в нормализованные
У всех трех есть свои преимущества и недостатки, но какой подход наиболее эффективен?
PS: я использую firebase в качестве базы данных, и есть дочерние прослушиватели событий, куда отправляются данные.