Как разработать схему "звезда"

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

Вернуть литерал

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

return {
  notificationBar: {
    open: true
  }
}

Однако, это не часто будет уместно, потому что маловероятно, что ваше состояние будет таким простым.


Объединить редукторы

Redux предоставляет вам полезный метод для объединения нескольких редукторов, которые работают с различными частями объекта состояния. В этом случае вы бы создали редуктор notificationBar, который обрабатывал бы только этот объект.

 createStore(combineReducers({
   notificationBar: function(state=initialNBarState, action) {
     switch (action.type) {
       case actions.LAYOUT_NOTIFICATIONBAR_OPEN:
         return Object.assign({}, state, { open: true });
   }
 });

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

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


Использование неизменяемых данных

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

Мори

Мори - это результат компиляции структур данных и функционального API Clojure в JS.

import { hashMap, updateIn } from 'mori';

const initialState = hashMap(
  "notificationBar", hashMap(
    "open", false
  )
);

// ...

return updateIn(state, ['notificationBar', 'open'], true);

ImmutableJS

ImmutableJS - это более императивный подход к переносу семантики попыток с отображением хэш-массивов из постоянных структур данных Clojure в Javascript.

import { Map } from 'immutable';

const initialState = Map({
  notificationBar: Map({
    open: true
  });
});

// ...

return state.setIn(['notificationBar', 'open'], true);

Псевдоним Object.assign

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

function $set(...objects) {
  return Object.assign({}, ...objects);
}

return $set(state, {
  notificationBar: $set(state.notificationBar, {
    open: true,
  })
});

Использование неизменяемых помощников

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

response-addons-update

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

import update from 'react-addons-update';

return update(state, {
  notificationBar: {
    open: { $set: true }
  }
});

dot-prop-immutable

Эта библиотека позволяет использовать знакомые пути точек для указания обновлений (вложенных) свойств.

import dotProp from 'dot-prop-immutable';

return dotProp.set(state, 'notificationBar.open', true);

update-in

Эта библиотека является оберткой вокруг react-addons-update и предоставляет более функциональный синтаксис для обновления (вложенных) свойств.

Вместо того, чтобы передавать новое значение, вы передаете функцию, которая принимает старое значение и возвращает новое.

import updateIn from 'update-in';

return updateIn(state, ['notificationBar', 'open'], () => true);

immutable-path

Для обновления свойств эта библиотека похожа на нечто среднее между dot-prop-immutable и update-in.

import path from 'immutable-path';

return path.map(state, 'notificationBar.open', () => true);
11
задан Anony-Mousse 19 December 2012 в 09:20
поделиться

1 ответ

Дизайн звездообразной схемы всегда определяется бизнес-потребностями клиента . Какие вопросы задаются? Насколько подробными должны быть ответы?

В вашем примере интересными вопросами могут быть «Количество договоров по филиалам или LoanManager» или «Управляемая сумма ссуд по филиалам или LoanManager». В этом случае Branch и LoanManager станут вашими измерениями , а Count (LoanContract) и Sum (LoanContract.amount) будет вашим мерами . Обычным дополнительным параметром является время, обычно неделя или квартал .

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

DimBranch ( branchNo )
DimLoanManager ( empNo )
DimQuarter ( year, qNo )  -- qNo in (1,2,3,4)
DimWeek ( year, weekNo )  -- weekNo in (0..53), depending on business rules

Measures ( branchNo, empNo, year, qNo, weekNo, numContracts, sumLoans )

Для бизнес-вопросов, которые вы уже задали в своем вопрос,

9
ответ дан 3 December 2019 в 10:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: