O que é QL?
A QL é uma linguagem de consulta declarativa orientada a objeto otimizada para habilitar uma análise eficiente de estruturas de dados hierárquicas, em particular, bancos de dados que representam artefatos de software.
Um banco de dados é uma coleção de dados organizada. O modelo de banco de dados usado com mais frequência é o relacional, que armazena dados em tabelas. O SQL (Structured Query Language) é a linguagem de consulta mais usada para bancos de dados relacionais.
A finalidade de uma linguagem de consulta é fornecer uma plataforma de programação na qual você possa fazer perguntas sobre informações armazenadas em um banco de dados. Um sistema de gerenciamento de banco de dados gerencia o armazenamento e a administração de dados e fornece o mecanismo de consulta. Uma consulta normalmente se refere às entidades de banco de dados relevantes e especifica várias condições (chamadas de predicados) que devem ser atendidas pelos resultados. A avaliação de consulta envolve verificar esses predicados e gerar os resultados. Algumas das propriedades desejáveis de uma boa linguagem de consulta e sua implementação incluem:
- Especificações declarativas: uma especificação declarativa descreve as propriedades que o resultado deve satisfazer, em vez de fornecer o procedimento para calcular o resultado. No contexto das linguagens de consulta de banco de dados, as especificações declarativas abstraem os detalhes do sistema de gerenciamento de banco de dados subjacente e das técnicas de processamento de consulta. Isso simplifica muito a escrita de consultas.
- Expressividade: uma linguagem de consulta poderosa permite que você grave consultas complexas. Isso torna o idioma amplamente aplicável.
- Execução eficiente: as consultas podem ser complexas e os bancos de dados podem ser muito grandes, portanto, é crucial que uma implementação de linguagem de consulta processe e execute consultas com eficiência.
Nesta unidade, você aprenderá sobre os recursos básicos da linguagem de programação QL para que você possa escrever suas próprias consultas personalizadas ou entender melhor as consultas de código aberto pré-existentes disponíveis.
A sintaxe da QL
A sintaxe de QL é semelhante ao SQL. No entanto, a semântica de QL é baseada no Datalog, uma linguagem de programação lógica declarativa frequentemente usada como uma linguagem de consulta. Isso torna a QL principalmente uma linguagem lógica, e todas as operações em QL são operações lógicas. Além disso, a QL herda predicados recursivos do Datalog e adiciona suporte para agregações, tornando concisas e simples até mesmo as consultas mais complexas. Por exemplo, considere um banco de dados que contém relações pai-filho para pessoas. Se você quiser encontrar o número de descendentes de uma pessoa, normalmente você:
- Encontra um descendente de determinada pessoa, ou seja, um filho ou um descendente de um filho.
- Contaria o número de descendentes encontrados usando a etapa anterior.
Quando você escreve esse processo em QL, ele se assemelha muito a essa estrutura descrita. Observe que o exemplo usou a recursão para encontrar todos os descendentes da pessoa determinada e uma agregação para contar o número de descendentes. A tradução dessas etapas para a consulta final sem adicionar detalhes de procedimento é possível devido à natureza declarativa da linguagem. O código QL seria semelhante a este:
Person getADescendant(Person p) {
result = p.getAChild() or
result = getADescendant(p.getAChild())
}
int getNumberOfDescendants(Person p) {
result = count(getADescendant(p))
}
Orientação do objeto
A orientação do objeto é um recurso importante da QL. Os benefícios da orientação do objeto são bem conhecidos. Ele aumenta a modularidade, habilita o ocultamento de informações e permite a reutilização de código. A QL oferece todos esses benefícios sem comprometer sua base lógica. Isso é feito por meio da definição de um modelo de objeto simples em que as classes são modeladas como predicados e herança como implicação. As bibliotecas disponibilizadas para todas as linguagens com suporte fazem uso extensivo de classes e herança.
QL e linguagens de programação de uso geral
Aqui estão algumas diferenças conceituais e funcionais proeminentes entre linguagens de programação de uso geral e QL:
- A QL não tem recursos imperativos, como atribuições a variáveis ou operações do sistema de arquivos.
- O QL opera em conjuntos de tuplas e uma consulta pode ser exibida como uma sequência complexa de operações de conjunto que define o resultado da consulta.
- A semântica baseada em conjunto da QL torna muito natural processar coleções de valores sem precisar se preocupar em armazená-las, indexá-las e atravessá-las com eficiência.
Em linguagens de programação orientadas a objeto, a instanciação de uma classe envolve a criação de um objeto alocando memória física para manter o estado dessa instância da classe. Na QL, as classes são apenas propriedades lógicas que descrevem conjuntos de valores já existentes.