Дизайн приложения для обработки данных до базы данных - PullRequest
2 голосов
/ 11 октября 2008

У меня есть большая коллекция данных в файле Excel (и CSV-файлы). Данные должны быть помещены в базу данных (MySQL). Однако, прежде чем он попадет в базу данных, его необходимо обработать ... например, если столбцы 1 меньше столбца 3, добавьте 4 в столбец 2. Перед сохранением информации необходимо соблюдать несколько правил.

Каким будет хороший дизайн для выполнения этой задачи? (с использованием Java)

Дополнительные примечания

Процесс должен быть автоматизирован. В том смысле, что мне не нужно вручную входить и изменять данные. Мы говорим о тысячах строк данных с 15 столбцами информации на строку.

В настоящее время у меня есть своего рода дизайн цепочки ответственности. Один класс (Java) для каждого правила. Когда одно правило выполнено, оно вызывает следующее правило.

Подробнее

Как правило, имеется около 5000 строк на лист данных. Скорость не является большой проблемой, потому что этот большой ввод не часто происходит.

Я рассматривал слюни, но не был уверен, что задача была достаточно сложной для дролов.

Пример правил:

  1. Вся валюта (данные в определенных столбцах) не должна содержать символы валют.

  2. Названия категорий должны быть одинаковыми (например, книжный шкаф = книжный шкаф)

  3. Даты ввода не могут быть будущими датами

  4. Ввод текста может содержать только [A-Z 0-9 \ s]

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

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

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

Ответы [ 8 ]

1 голос
/ 12 октября 2008

Если бы я не хотел сделать это за 1 шаг (как упоминает Оли), я бы, вероятно, использовал трубу и фильтры . Поскольку ваши правила относительно просты, я бы, вероятно, сделал пару классов на основе делегатов. Например (код C #, но Java должен быть очень похожим ... возможно, кто-то мог бы перевести?):

interface IFilter {
   public IEnumerable<string> Filter(IEnumerable<string> file) {
   }
}

class PredicateFilter : IFilter {
   public PredicateFilter(Predicate<string> predicate) { }

   public IEnumerable<string> Filter(IEnumerable<string> file) {
      foreach (string s in file) {
         if (this.Predicate(s)) {
            yield return s;
         }
      }
   }
}

class ActionFilter : IFilter {
  public ActionFilter(Action<string> action) { }

  public IEnumerable<string> Filter(IEnumerable<string> file) {
      foreach (string s in file) {
         this.Action(s);
         yield return s;
      }
  }
}

class ReplaceFilter : IFilter {
  public ReplaceFilter(Func<string, string> replace) { }

  public IEnumerable<string> Filter(IEnumerable<string> file) {
     foreach (string s in file) {
        yield return this.Replace(s);
     }
  }
}

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

1 голос
/ 12 октября 2008

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

1 голос
/ 11 октября 2008

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

Вы также можете посмотреть на что-то, называемое Drules, в настоящее время Jboss-rules. Я использовал это некоторое время назад для части моего приложения, насыщенной правилами, и мне понравилось то, что бизнес-логика может быть выражена, например, в электронной таблице или DSL, которые затем компилируются в java (время выполнения, и я также опция времени компиляции). Это делает правила немного более лаконичными и, следовательно, удобочитаемыми. Это также очень легко учиться (2 дня или около того).

Вот ссылка на open source Jboss-rules . На jboss.com вы, несомненно, можете приобрести официально поддерживаемую версию, если она больше подходит вашим компаниям.

0 голосов
/ 13 октября 2008

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

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

Я использовал этот подход много раз, и он работает очень хорошо; это просто не очень сексуально.

0 голосов
/ 11 октября 2008

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

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

Если вы хотите сузить до 1/2 решения для вашей реализации, попробуйте дать более подробную информацию.

Удачи

0 голосов
/ 11 октября 2008

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

0 голосов
/ 11 октября 2008

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

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

0 голосов
/ 11 октября 2008

Класс для каждого правила? Действительно? Возможно, я не понимаю количество или сложность этих правил, но я бы (полупсевдокод):

public class ALine {
    private int col1;
    private int col2;
    private int coln;
    // ...

    public ALine(string line) {
         // read row into private variables
         // ...

         this.Process();
         this.Insert();
    }

    public void Process() {
         // do all your rules here working with the local variables
    }

    public void Insert() {
        // write to DB
    }
}

foreach line in csv
    new ALine(line);
...