Где обрабатывать нормализованные данные? - PullRequest
0 голосов
/ 19 марта 2019

В моей базе данных самый эффективный способ сохранить древовидную структуру - это поместить дочерний элемент в качестве ключа и его родительский элемент в качестве значения:

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 в качестве базы данных, и есть дочерние прослушиватели событий, куда отправляются данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...