Дизайн приложения для обработки данных до базы данных
У меня есть большая коллекция данных в файле Excel (и CSV-файлы). Данные должны быть помещены в базу данных (MySQL). Однако, прежде чем он попадет в базу данных, его необходимо обработать. Например, если столбцы 1 меньше столбца 3, добавьте 4 в столбец 2. Перед сохранением информации необходимо соблюдать несколько правил.
Какой будет хороший дизайн для выполнения этой задачи? (используя Java)
Дополнительные примечания
Процесс должен быть автоматизирован. В том смысле, что мне не нужно вручную входить и изменять данные. Мы говорим о тысячах строк данных с 15 столбцами информации на строку.
В настоящее время у меня есть своего рода дизайн цепочки ответственности. Один класс (Java) для каждого правила. Когда одно правило выполнено, оно вызывает следующее правило.
Больше информации
Как правило, существует около 5000 строк на лист данных. Скорость не является большой проблемой, потому что такой большой вклад не часто случается.
Я рассмотрел слюни, но я не был уверен, что задача была достаточно сложной для дроллов.
Пример правил:
Все валюты (данные в определенных столбцах) не должны содержать символы валюты.
Названия категорий должны быть одинаковыми (например, книжный шкаф = книжный шкаф)
Даты входа не могут быть будущими датами
Ввод текста может содержать только [AZ 0-9 \s]
так далее..
Кроме того, если какой-либо столбец информации является недействительным, о нем необходимо сообщить, когда обработка завершена (или, возможно, прекратить обработку).
Мое текущее решение работает. Однако я думаю, что есть возможности для улучшения, поэтому я ищу идеалы относительно того, как его можно улучшить и как другие люди справляются с подобными ситуациями.
Я рассматривал (очень кратко) использование слюней, но я не был уверен, что работа была достаточно сложной, чтобы использовать слюни.
8 ответов
Если бы я не хотел делать это за 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);
}
}
}
Оттуда вы можете либо напрямую использовать фильтры делегатов, либо разбить их на подклассы. Затем зарегистрируйте их в конвейере, который пропустит их через каждый фильтр.
Просто создайте функцию для применения каждого правила и вызовите каждую подходящую функцию для каждого значения. Я не понимаю, как для этого требуется какая-то экзотическая архитектура.
Я думаю, что ваш метод в порядке. Особенно, если вы используете один и тот же интерфейс на каждом процессоре.
Вы также можете взглянуть на что-то, называемое Drules, в настоящее время Jboss-rules. Я использовал это некоторое время назад для части моего приложения, насыщенной правилами, и мне понравилось то, что бизнес-логика может быть выражена, например, в электронной таблице или DSL, которые затем компилируются в Java (во время выполнения, и я думаю, что есть также опция времени компиляции). Это делает правила немного более лаконичными и, следовательно, удобочитаемыми. Это также очень легко учиться (2 дня или около того).
Вот ссылка на Jboss-правила с открытым исходным кодом. На jboss.com вы, несомненно, можете приобрести официально поддерживаемую версию, если она больше подходит вашим компаниям.
Вы можете видеть, что все разные ответы исходят из их собственного опыта и перспективы.
Поскольку мы мало знаем о сложности и количестве строк в вашей системе, мы склонны давать советы на основе того, что мы сделали ранее.
Если вы хотите сузить до 1/2 решения для вашей реализации, попробуйте дать более подробную информацию.
Удачи
Массовая загрузка данных во временную таблицу, а затем использование sql для применения ваших правил. использовать временную таблицу, как основу для вставки в реальную таблицу. бросьте временную таблицу.
Это может быть не то, что вы хотите услышать, это не "забавный способ", но есть гораздо более простой способ сделать это.
Пока ваши данные оцениваются построчно... вы можете настроить другой лист в вашем файле Excel и использовать функции стиля электронной таблицы для выполнения необходимых преобразований, ссылаясь на данные из необработанного листа данных. Для более сложных функций вы можете использовать встроенную в Excel VBA для записи пользовательских операций.
Я использовал этот подход много раз, и он работает очень хорошо; это просто не очень сексуально.
Ваша методология использования классов для каждого правила звучит немного тяжеловесно, но она имеет то преимущество, что ее легко модифицировать и расширять в случае появления новых правил.
Что касается загрузки данных, массовая загрузка - это путь. Я прочитал некоторую информацию, которая предполагает, что это может быть на целых 3 порядка быстрее, чем загрузка с использованием операторов вставки. Вы можете найти некоторую информацию об этом здесь
Класс для каждого правила? В самом деле? Возможно, я не понимаю количество или сложность этих правил, но я бы понял (полупсевдокод):
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);