Banco de dados de restrições

8

Conheço a intuição por trás da programação de restrições, por assim dizer, nunca experimentei programação usando um solucionador de restrições. Embora eu ache que é uma situação diferente conseguir o que definiríamos como dados consistentes.

Contexto:

Temos um conjunto de regras para implementar em um servidor ETL. Essas regras são:

  • agindo em uma linha.
  • inter-linhas atuantes, em uma ou em tabelas diferentes.
  • agindo da mesma maneira entre duas execuções (deve manter a mesma restrição em todos os dados ou apenas nas últimas n execuções);

O terceiro caso é diferente do segundo, pois ocorre quando o segundo caso é válido, mas por um número bem definido de execuções. Pode ser aplicado a uma única execução (um arquivo) ou entre (1 a n (anterior) ou em Todos os arquivos).

Tecnicamente, como concebemos o ETL, ele não tem memória entre duas execuções: dois arquivos (mas isso deve ser repensado)

Para a aplicação do terceiro tipo de regra, o ETL precisa ter memória (acho que acabaríamos fazendo backup de dados no ETL); Ou remarcando infinitamente (um trabalho) em todo o banco de dados após algum tempo, para que os dados que terminam no banco de dados não cumpram necessariamente o terceiro tipo de regra em tempo.

Exemplo:

Embora tenhamos um fluxo contínuo de dados, aplicamos restrições para ter todo um banco de dados restrito. No dia seguinte, receberemos um backup ou dados de correção por um mês, por exemplo, para esta janela de tempo, gostaríamos de ter as restrições satisfeitas apenas por isso. executar (nesta janela de tempo), sem se preocupar com todo o banco de dados, para execuções futuras, todos os dados devem ser restringidos como antes, sem se preocupar com dados anteriores. Você pode imaginar outras regras que poderiam se encaixar na lógica temporal .

Por enquanto, temos apenas o primeiro tipo de regras implementadas. A maneira como pensei nisso é ter um banco de dados minificado (de qualquer tipo: MySQL, PostgreSQL, MongoDB ...) que faça backup de todos os dados (apenas colunas restritas, provavelmente com valores de hash) com sinalizadores referentes à consistência baseada em dados anteriores. tipo de regras.

Pergunta: Existem alternativas de soluções / concepção que facilitariam esse processo?

Para ilustrar em uma linguagem de programação Fogão; Um exemplo de um conjunto de regras e seguintes ações:

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')

Nota : Embora a programação de restrições seja, em teoria, um paradigma para resolver problemas combinatórios e, na prática, pode acelerar o desenvolvimento e a execução de problemas; Eu acho que isso é diferente de um problema de solução de restrições; Como o primeiro objetivo não é otimizar restrições antes da resolução, provavelmente nem mesmo limitar os domínios de dados; Sua principal preocupação é aplicar regras na recepção de dados e executar algumas ações básicas (Rejeitar uma linha, Aceitar uma linha, Logar ...).

Eu realmente espero que essa não seja uma pergunta muito ampla e que este seja o lugar certo.

Curcuma_
fonte

Respostas:

3

Encontrei uma solução sofisticada para alcançar mais do que pensava; falando sobre como verificar a consistência dos dados. Aparentemente, é isso que chamaríamos de análise de dados orientada a testes

Portanto, agora com esta implementação estamos vinculados ao Python e Pandas, mas felizmente não apenas. Podemos até verificar a consistência dos dados nas tabelas MySQL, PostgreSQL ....

A vantagem em que não pensei é que podemos deduzir regras com base em dados de amostra. Isso pode ser útil para definir regras. É por isso que existe tdda.constraints.verify_dfe o tdda.constraints.discover_df.

Tanto quanto eu li, ele não propõe uma solução para verificar a consistência (mais fraca) dos últimos (n) arquivos. Algo que pensei que poderíamos chamar consistência de arquivos em lote, que só garante a satisfação de regras para algum conjunto de execuções (últimas n execuções) e nem todos os dados. Ele atua apenas em arquivos únicos, precisa de uma fiação de nível superior para poder condicionar (n) arquivos que chegam sucessivamente.

Para mais: https://tdda.readthedocs.io/en/latest/constraints.html#module-tdda.constraints

assertCSVFilesCorrect Verifica um conjunto de arquivos em um diretório, o mesmo é possível para quadros de dados do Pandas, etc.

A partir da documentação oficial:

A biblioteca tdda.constraints é usada para descobrir restrições de um DataFrame (Pandas), gravá-las como JSON e verificar se os conjuntos de dados atendem às restrições no arquivo de restrições. Ele também suporta tabelas em uma variedade de bancos de dados de relações. Há também um utilitário de linha de comando para descobrir e verificar restrições e detectar registros com falha.

ps: Ainda estou aberto a outras soluções, deixe-me saber como eu imagino que este é um caso de uso para qualquer solução ETL.

Também abro uma recompensa para enriquecer ainda mais as respostas.

Curcuma_
fonte
2

Você também pode procurar no SQL transactions. Uma transação consiste em uma ou mais instruções, solicitadas para serem executadas por um único usuário ou aplicativo. Eles podem ler ou até modificar dados em um banco de dados.

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

Você pode especificar certas restrições e usar ROLLBACKse uma dessas restrições for violada. A reversão pode ser explicitamente codificada pelo desenvolvedor, mas também pode ser lançada do sistema. (por exemplo, quando apareceu um erro que não é tratado explicitamente pelo desenvolvedor ou ao executar um gatilho). As transações podem não estar no caminho umas das outras. Eles precisam ser executados de maneira "isolada". várias transações simultâneas devem produzir os mesmos resultados nos dados que essas mesmas transações executadas sequencialmente, em alguma ordem (não especificada). Como todos os DBMS modernos garantem propriedades ACID quando se trata de transações, a execução das transações é confiável; portanto, o estado do seu banco de dados não deve conter inconsistências.

Não tenho certeza se é isso que você quer dizer, mas talvez isso ajude.

Psychotechnopath
fonte
Eu estava procurando uma maneira mais fluente de restringir fluxos. no meu caso, as transações precisam de muito código para restringir a chegada de dados no tempo, eu acho. No entanto, parece ser a maneira mais popular no mundo do SQL.
Curcuma_ 11/11/19
1
Eu vejo. Não ouvi falar de uma maneira fluente de restringir fluxos de dados mais recentes de uma maneira mais flexível que os dados atualmente no seu banco de dados. AFAIK (pelo menos em sistemas SQL), você cuida da programação de restrições uma vez, verifique se está feito corretamente, para não precisar se preocupar com isso novamente. Em seguida, o banco de dados já é consistente e, quando novos dados forem inseridos nas restrições do banco de dados, serão automaticamente verificados e tratados. Você nunca precisará verificar a consistência de todo o banco de dados quando n novos itens forem inseridos. Apenas para os n itens novos constrangimentos serão verificados
Psychotechnopath