Redux нормализованное дерево состояний для постов и комментариев

mongodb redux

271 просмотра

2 ответа

3768 Репутация автора

Redux рекомендует использовать нормализованное дерево состояний приложения, но я не уверен, что это лучший метод в этом случае. Предположим следующий случай:

  1. Каждый Circlehas_many Posts.
  2. Каждый Posthas_many Comments.

В базе данных на сервере каждая модель выглядит следующим образом:

Круг:

{
  _id: '1'
  title: 'BoyBand'
}

Почта:

{
  _id: '1',
  circle_id: '1',
  body: "Some Post"
}

Комментарий:

{
  _id: '1',
  post_id: '1',
  body: "Some Comment"
}

В состоянии приложения (конечный результат всех редукторов) на интерфейсе выглядит так:

{
  circles: {
    byId: {
      1: {
        title: 'BoyBand'
      }
    },
    allIds: [1]
  },
  posts: {
    byId: {
      1: {
        circle_id: '1',
        body: 'Some Post'
      }
    },
    allIds: [1]
  },
  comments: {
    byId: {
      1: {
        post_id: '1',
        body: 'Some Comment'
      },
    allIds: [1]
  }
}

Теперь, когда я иду в CircleView, я получаю Circleиз бэкэнда, который возвращает все postsи commentsсвязанный с ним.

export const fetchCircle = (title) => (dispatch, getState) => {
  dispatch({
    type: constants.REQUEST_CIRCLE,
    data: { title: title }
  })

  request
    .get(`${API_URL}/circles/${title}`)
    .end((err, res) => {
      if (err) {
        return
      }

      // When you fetch circle from the API, the API returns:
      // {
      //   circle: circleObj,
      //   posts: postsArr,
      //   comments: commentsArr
      // }
      // so it's easier for the reducers to consume the data

      dispatch({
        type: constants.RECEIVE_CIRCLE,
        data: (normalize(res.body.circle, schema.circle))
      })
      dispatch({
        type: 'RECEIVE_POSTS',
        data: (normalize(res.body.posts, schema.arrayOfPosts))
      })
      dispatch({
        type: 'RECEIVE_COMMENTS',
        data: (normalize(res.body.comments, schema.arrayOfComments))
      })
    })
}

До этого момента, я думаю, я все делал довольно стандартным способом. Однако, когда мне захотелось визуализировать каждый Postкомпонент, я понял, что заполнение постов их комментариями стало неэффективным (O (N ^ 2)) по сравнению с тем, когда я держал свое дерево состояний в следующем формате.

{
  circles: {
    byId: {
      1: {
        title: 'BoyBand'
      }
    },
    allIds: [1]
  },
  posts: {
    byId: {
      1: {
        circle_id: '1',
        body: 'Some Post'
        comments: [arrOfComments]
      }
    },
    allIds: [1]
  }
}

Это противоречит моему пониманию того, что в дереве избыточных состояний лучше поддерживать все в норме.

В. Должен ли я на самом деле держать вещи денормализованными в таком случае, как это? Как мне определить, что делать?

Автор: Maximus S Источник Размещён: 19.07.2016 08:59

Ответы (2)


2 плюса

1941 Репутация автора

Я бы пошел: да нормализуй это, но сделай это на бэкэнде!

Почему?

  • Удаление проще

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

  • Работать с данными проще

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

  • У вас нет отношения многих ко многим

у вас нет нескольких постов, которые ссылаются на один и тот же комментарий, поэтому имеет смысл нормализовать данные.

  • Вы не должны быть ограничены API

Если это сторонний API, сделайте так, чтобы ваш бэкэнд получил API и нормализовал там данные. Вы не должны быть ограничены API, и я не знаю, к каким типам данных вы обращаетесь, но вы можете окончательно сохранить DNS-запрос для пользователя и обслуживать кэшированные данные, если API недоступен. Если вы полагаетесь на то, что API работает, вы вводите одну точку отказа.


Что касается ваших проблем с производительностью, они должны быть незначительными, если вы нормализуетесь на бэкэнде, и вы должны измерить его и взять критический код для проверки кода.

Автор: mash Размещён: 24.07.2016 08:56

0 плюса

424 Репутация автора

На мой взгляд, список комментариев специфичен для любого поста. Пользователь не может оставлять один комментарий в нескольких сообщениях. И нет ничего плохого в том, что комментарии тесно связаны с постом. Определенный комментарий легко обновить / удалить (присутствуют как postId, так и commentId). Удаление поста тривиально. То же самое с кругом. Немного сложнее удалить все комментарии конкретного пользователя. И я думаю, что нет строгих правил, ПРАВИЛЬНОГО пути и т. Д. ... чаще всего это зависит. KiSS ;)

Размышляя о том, как организовать комментарии на стороне клиента, я читал эту статью о возможных структурах БД для аналогичной ситуации. https://docs.mongodb.com/ecosystem/use-cases/storing-comments/

Автор: Fake Fish Размещён: 30.07.2016 11:26
Вопросы из категории :
32x32