База данных ограничений - PullRequest
       50

База данных ограничений

8 голосов
/ 02 октября 2019

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

Контекст:

У нас есть набор правил для реализации на сервере ETL. Этими правилами являются:

  • , действующие на одну строку.
  • действующие междурядья, в одной или разных таблицах.
  • , действующие одинаково между двумя прогонами (Он должен поддерживать одно и то же ограничение для всех данных или только для последних n запусков);

Третий случай отличается от второго, поскольку он имеет место, когда второй случай выполняется, но для четко определенного числа прогонов. Он может применяться для одного отдельного прогона (один файл) или между (от 1 до n (предыдущий) или для всех файлов).

Технически, так как мы задумали ETL, он не имеет памяти между двумя прогонами: двафайлы (но это нужно переосмыслить)

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

Пример:

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

На данный момент у нас реализованы только правила первого типа. Я подумал о том, чтобы иметь минимизированную базу данных (любого типа: MySQL, PostgreSQL, MongoDB ...), которая резервирует все данные (только ограниченные столбцы, возможно, с хешированными значениями) с флагами, ссылающимися на согласованность, основанную на предыдущихТип правил.

Вопрос: Существуют ли решения / альтернативы концепции , которые облегчили бы этот процесс?

К иллюстрируют на языке программирования Cook;Пример набора правил и следующих действий:

run1 : WHEN tableA.ID == tableB.ID AND tableA.column1 > tableB.column2
       BACK-UP 
       FLAG tableA.rule1
AFTER run1 : LOG ('WARN')

run2 : WHEN tableA.column1 > 0
       DO NOT BACK-UP 
       FLAG tableA.rule2
AFTER run2 : LOG ('ERROR')

Примечание : хотя теоретически программирование ограничений является парадигмой для решения комбинаторных задач и на практике может ускорить разработку и выполнение задач;Я думаю, что это отличается от проблемы решения ограничений;Поскольку первая цель не в том, чтобы оптимизировать ограничения перед разрешением, возможно, даже не ограничивая области данных;Его главная задача - применить правила к приему данных и выполнить некоторые основные действия (Отклонить строку, Принять строку, Регистрация ...).

Я действительно надеюсь, что это не очень широкий вопрос, иэто правильное место.

Ответы [ 2 ]

3 голосов
/ 03 октября 2019

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

Так что теперь с этой реализацией мы связаны с Python и Pandas, но, к счастью, не только. Мы даже можем проверить согласованность данных в MySQL, PostgreSQL ... таблицах.

Плюс, о котором я не задумывался, - это то, что мы можем вывести правила на основе примеров данных. Это может быть полезно для установки правил. Вот почему существует tdda.constraints.verify_df и tdda.constraints.discover_df.

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

Для более подробной информации: https://tdda.readthedocs.io/en/latest/constraints.html#module-tdda.constraints

assertCSVFilesCorrect Проверяет набор файлов в каталоге, то же самое возможно для файлов данных Pandas и т. Д.

Из официальной документации:

Библиотека tdda.constraints используется для обнаруженияограничения из (Pandas) DataFrame, запишите их как JSON и убедитесь, что наборы данных соответствуют ограничениям в файле ограничений. Он также поддерживает таблицы в различных реляционных базах данных. Существует также утилита командной строки для обнаружения и проверки ограничений, а также для обнаружения сбойных записей.

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

Я также открываю щедрость для дальнейшего обогащения ответов.

2 голосов
/ 11 октября 2019

Вы также можете посмотреть в SQL transactions. Транзакция состоит из одного или нескольких операторов, которые запрашиваются для выполнения одним пользователем или приложением. Они могут читать или даже изменять данные в базе данных.

START TRANSACTION
Do DB stuff, check if constraints are violated
COMMIT

Вы можете указать определенные ограничения и использовать ROLLBACK, если нарушено одно из этих ограничений. Откат может быть явно закодирован разработчиком, но также может быть сгенерирован из системы. (например, при появлении ошибки, которая явно не обрабатывается разработчиком, или при выполнении триггера). Транзакции могут не мешать друг другу. Они должны быть выполнены «изолированно». несколько одновременных транзакций должны давать те же результаты в данных, что и те же транзакции, выполняемые последовательно, в некотором (неуказанном) порядке. Поскольку все современные СУБД гарантируют свойства ACID, когда дело доходит до транзакций, выполнение транзакций является надежным, поэтому в состоянии вашей базы данных не должно быть никаких несоответствий.

Не уверен, что это то, что вы имеете в виду, но, возможно, это поможет.

...