Skip to content

Latest commit

 

History

History
121 lines (86 loc) · 4.02 KB

README-RU.md

File metadata and controls

121 lines (86 loc) · 4.02 KB

Computed state

Документоориентированное хранилище для веб-приложений.

Основные принципы

Каждая веб-страница (приложение) определяется исключительно одной сущностью, например:

  • статья: описание, рейтинг, тэги, комментарии
  • блог: название блога, перечень топ статей
  • продукт: описание, цена, кол-во просмотров
  • товар/категория: общее описание, перечень конкретных предложений (продуктов)

Каждая сущность имеет

  • свойства (название, цена)
  • связи (тэги, комментарии)

Такая сущность может быть описана с помощью NoSQL документа, подобно https://docs.mongodb.com/manual/core/document/

{
  id: 'xyz',
  name: 'Laptop XYZ',
  price: 499,
  rating: 7.5,
  reviews: [{
    id: 1,
    description: 'Very xz',
    userId: 234,
    userAvatar: '/ava.png'
  }]
}

В итоге получается некая вью-модель, описывающая всё состояние веб-приложения. Такую вью-модель можно отобразить в браузере или на сервере, используя любые веб-инструменты для построения ДОМ-дерева:

  • React
  • JSDOM
  • BEM
  • etc.

Возможности библиотеки:

  • описывает формат для построения вью-модели
  • предоставляет АПИ для взаимодействия с данными
  • автоматически устанавливает значения вычисляемых свойств

Формат документа/сущности

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

Вычисляемые свойства

Автоматически вычисляет значения свойств как только изменяются наблюдаемые свойства.

Подобные программы:

Формат позволяет задавать соответствующие формулы:

var event = {
  start: { type: 'Number' },
  end: { type: 'Number' },
  duration: {
    type: 'Number',
    computed: ['start', 'end', function(start, end) {
      if (start === null || end === null) { return null; }

      return end - start;
    }]
  }
};

в том числе вычисления работают и для связанных сущностей (композиций/агрегаций)

var group = {
  id: { type: 'Text' },

  name: { type: 'Text' },

  members: {
    type: 'ItemList',
    ref: member
  },

  numberOfAdultMembers: {
    type: 'Number',
    computed: ['members', function(members) {
        return members.filter(m => m.age >= 18).length;
    }]
  }
}

Идентификатор сущности

Каждая сущность должна содержать уникальный идентификатор. По умолчанию записывается как id. Это позволяет проводить операции вставки, обновления, удаления связанных сущностей.

TODO

  • индексация данных
  • документация: изменение, добавление, удаление