Как хранить и проверять данные между переходами состояний?

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

Хорошо, все хорошо, и мы достигаем места, где мы думаем, что он будет работать.

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

Например, существует определенный fsm, который объединит посылки. Для этого нам нужно как минимум две входные посылки и некоторые данные по новой результирующей посылке.

Как мы можем:

  1. Сохраните нужные нам данные, которые будут разными, в зависимости от fsm и задач, которые он будет выполнять? Я думал о большой json blob.

  2. Подтвердите это, не сойдя с ума.

Фон: Django, marionette js, Django rest Framework и PostgreSQL.

Асинхронные задачи и изменения состояния с помощью сельдерея.

Я спрашиваю об этом, потому что я не хочу, чтобы многие фиксированные модели привязывались к определенной проверке. Это в конечном итоге приведет к большому количеству таблиц, и его будет сложнее поддерживать. (И поэтому я предложил поле json для хранения всех данных для каждого состояния, проверить его и, если все это хорошо, перейти к следующему состоянию).

PS: Извините за плохое форматирование. Использование моего телефона без правильной клавиатуры.

7 голосов | спросил George Silva 1 22016vEurope/Moscow11bEurope/MoscowTue, 01 Nov 2016 03:50:40 +0300 2016, 03:50:40

2 ответа


1

Я бы пошел одним из двух способов в зависимости от конкретных деталей реализации.

(Извиняюсь, я не знаком с Django, поэтому мой ответ говорит об общей архитектуре и не содержит конкретных предложений для используемого вами языка)

1. Поля JSON для данных, использующих однонамерное наследование

Как вы предположили, я поместил данные в поля JSON (B) в Postgres. Я бы выполнил проверку путем подклассификации (или аналогичной) модели задач с использованием однонаправленного наследования (STI).

Быстрый google предполагает, что Django может не выполнять STI изначально, но вы можете получить достаточно простую версию, добавив, скажем, type в таблицу задач и использовать ее для динамической загрузки класса, который содержит ваши проверки для этого типа задач.

Доводы

  • Выразительный - ваши правила проверки гибки, как язык
  • Простой - легко вставать и работать с

против

  • Неловко масштабировать - если у вас много разных задач, это может выйти из-под контроля. (Это можно смягчить, группируя аналогичные задачи, чтобы использовать один и тот же класс проверки)
  • Зависит от разработчика - любые изменения в проверке или добавлении новых задач требуют разработчика

2. Храните проверку также в JSON

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

Доводы

  • Стандартные инструменты. Если вы используете схему JSON, будут стандартные библиотеки, с которыми вы могли бы работать, чтобы проверить задачи.
  • Легче масштабировать - просто добавьте новый тип задачи в таблицу типов задач.

против

  • Может быть немного медленнее - немного больше, чтобы начать изначально
  • Менее выраженный - схема JSON не является языком программирования, поэтому она не так выразительна для определения правил (но на практике это было бы достаточно для большинства случаев)
ответил ChristopherJ 22 PMpSun, 22 Apr 2018 16:37:39 +030037Sunday 2018, 16:37:39
-1

Давайте понимать ваш контекст:

  

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

     

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

     

Фон: Django, marionette js, Django rest Framework и PostgreSQL.

Теперь ваши вопросы:

  

Как мы можем: Хранить нужные нам данные, которые будут отличаться, в зависимости от fsm и задач, которые он будет выполнять? Я думал о большой json blob.

Вы можете:

  • Создайте таблицу N x N в postgree (или любом другом связанном DB), определяющем отношения между предварительно созданными вами частями и каждым пользовательским FSM; вы можете создать таблицу полей, которая будет содержать введенный пользователем ввод, и поле может иметь ссылку на предварительно созданную задачу, присутствующую в FSM пользователя;
  • Для данных строковой структуры, вряд ли изменивших сверхурочную работу (например, пользователей /роли /разрешений в вашем приложении), вы продолжаете использовать отношение DB. Для данных с динамической структурой или в случаях, когда каждый экземпляр может иметь другой формат, вы можете сохранить эту информацию в дополнительном нереляционном или NoSql DB (например: mongoDB , который внутренне использует формат Bson). Реализация для этого будет очень простой и легко интегрируется с python (я использовал pymongo для этого)

О комментариях: Использовать ли БД или нет полностью ортогонально вопросу, заданному OP

Существуют приложения, использующие несколько типов БД, в зависимости от функций, которые ему нужны. Существуют приложения, в которых используется реляционная БД (например, SQL-сервер), нет-sql DB (например: mongoDB), а также в БД памяти (например: Redis). Например, Trello использует монго и redis. Поскольку этот пост помечен как «архитектура», я думаю, стоит упомянуть эти параметры, так как было бы полезно помочь решить проблему OP.

  

Как мы можем: Проверить его, не сходя с ума.

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

Если вы реализуете какой-либо объект Field, например, с свойством «Тип» на нем, вы можете реализовать валидаторы для этого типа поля; когда пользователь заполняет эту информацию и выбирает «числовой» тип, приложение запускает соответствующие валидаторы.

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

ответил Emerson Cardoso 7 PM000000100000002531 2017, 22:28:25

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132