Um quinteto é uma maneira de registrar dados atômicos, indicando seu papel em nossas vidas. Os quintetos podem descrever qualquer dado, enquanto cada um deles contém informações exaustivas sobre você e sobre relacionamentos com outros quintetos. Representa termos de domínio, independentemente da plataforma usada. Sua tarefa é simplificar o armazenamento de dados e melhorar a visibilidade de sua apresentação.

Vou falar sobre uma nova abordagem para armazenar e processar informações e compartilhar meus pensamentos sobre a criação de uma plataforma de desenvolvimento nesse novo paradigma.
O quinteto tem propriedades: tipo, valor, pai, ordem entre irmãos. Com o identificador, apenas 5 componentes são obtidos. Essa é a forma universal mais simples de registrar informações, um novo padrão que pode potencialmente se adequar a todos. Os quintetos são armazenados em um sistema de arquivos de uma única estrutura, em um campo contínuo de informações indexadas e monótonas.
Para registrar informações, há um número infinito de padrões, abordagens e regras, cujo conhecimento é necessário para trabalhar com esses registros. Os padrões são descritos separadamente e não estão diretamente relacionados aos dados. No caso de quintetos, usando qualquer um deles, você pode obter informações relevantes sobre sua natureza, propriedades e regras de trabalho com sua área de assunto. Seu padrão é uniforme e inalterado para todas as áreas. O quinteto está oculto do usuário - os metadados e os dados estão disponíveis para ele na forma familiar a muitos.
Um quinteto não é apenas informação, mas também comandos executáveis. Mas, acima de tudo, são os dados que você deseja armazenar, registrar e recuperar. Como no nosso caso eles são diretamente endereçados, conectados e indexados, nós os armazenaremos em um tipo de banco de dados. Para testar o protótipo de um sistema de armazenamento de dados de quinteto, por exemplo, usamos um banco de dados relacional regular.
Estrutura quinteto
A idéia principal deste artigo é substituir tipos de máquinas por termos humanos e substituir variáveis por objetos. Não pelos objetos que precisam de construtor, destruidor, interfaces e coletor de lixo, mas pelas unidades de informações de cristal puro nas quais um cliente opera. Ou seja, se o cliente disser "Aplicativo", salvar a
essência dessas informações na mídia não exigiria a experiência de um programador.

É útil focar a atenção do usuário apenas no valor do objeto, e seu tipo, pai, ordem (entre iguais na subordinação) e identificador devem ser óbvios no contexto ou simplesmente ocultos. Isso significa que o
usuário não sabe nada sobre quintetos , ele simplesmente define sua tarefa, garante que ela seja aceita corretamente e, em seguida, inicia sua execução.
Conceitos básicos
Existe um conjunto de tipos de dados que qualquer pessoa pode entender: sequência, número, arquivo, texto, data e assim por diante. Um conjunto tão simples é suficiente para formular o problema e para "programá-lo" e os tipos necessários para sua implementação. Os tipos básicos representados por quintetos podem ser assim:

Nesse caso, alguns dos componentes do quinteto não são usados e ele é usado como o tipo base. Isso facilita a navegação do núcleo do sistema ao navegar nos metadados.
Antecedentes
Devido à lacuna analítica entre o usuário e o programador, ocorre uma deformação significativa dos conceitos no estágio de definição do problema. O eufemismo, incompreensibilidade e iniciativa não solicitada muitas vezes transforma um pensamento simples e compreensível do cliente em uma mistura logicamente impossível, a julgar pelo ponto de vista do usuário.

A transferência de conhecimento deve ocorrer sem perda ou distorção. Além disso, no futuro, ao organizar o armazenamento desse conhecimento, é necessário livrar-se das restrições impostas pelo sistema de gerenciamento de dados selecionado.
Como armazenar dados
Como regra, existem muitos bancos de dados no servidor; cada um deles contém uma descrição da estrutura da entidade com um conjunto específico de atributos - dados interconectados. Eles são armazenados em uma ordem específica, idealmente ideal para amostragem.
O sistema de armazenamento de informações proposto é um compromisso entre vários métodos conhecidos: coluna, string e NoSQL. Ele foi projetado para resolver as tarefas normalmente executadas por um desses métodos.
Por exemplo, a teoria das bases das colunas é bonita: lemos apenas a coluna desejada e não todas as linhas de registros como um todo. No entanto, na prática, é improvável que os dados sejam colocados na mídia para que sejam aplicáveis a dezenas de seções diferentes da análise. Observe que atributos e métricas analíticas podem ser adicionados e removidos, às vezes mais rápido do que podemos reconstruir essa economia de coluna. Sem mencionar o fato de que os dados no banco de dados podem ser ajustados, o que também violará a beleza do plano de amostragem devido à fragmentação inevitável.
Metadados
Introduzimos um conceito - um termo - para descrever quaisquer objetos com os quais operamos: entidade, propriedade, solicitação, arquivo etc. Definiremos todos os termos que usamos em nossa área de assunto. E com a ajuda deles, descreveremos todas as entidades que possuem detalhes, inclusive na forma de relacionamentos entre entidades. Por exemplo, props - um link para uma entrada do diretório de status. O termo está escrito em um quinteto de dados.
Um conjunto de descrições de termos são metadados que definem a estrutura de tabelas e campos em um banco de dados regular. Por exemplo, existe a seguinte estrutura de dados: um aplicativo a partir de uma data que possui conteúdo (texto do aplicativo) e um Status, ao qual os participantes no processo de produção adicionam comentários indicando a data. No construtor de banco de dados tradicional, será algo parecido com isto:

Como decidimos ocultar do usuário todos os detalhes não essenciais, como IDs de ligação, por exemplo, o esquema será um pouco simplificado: as menções aos IDs são removidas e os nomes das entidades e seus valores-chave são combinados.
O usuário "desenha" a tarefa: uma solicitação da data de hoje que possui um estado (valor de referência) e ao qual você pode adicionar comentários indicando a data:

Agora, vemos 6 campos de dados diferentes em vez de 9, e todo o esquema nos oferece a leitura e compreensão de 7 palavras em vez de 13. Embora isso esteja longe de ser o principal, é claro.
A seguir, são apresentados os quintetos gerados pelo núcleo de controle para descrever essa estrutura:

São fornecidas explicações no lugar dos valores do quinteto destacados em cinza para maior clareza. Esses campos não são preenchidos porque todas as informações necessárias são determinadas exclusivamente pelos componentes restantes.
Veja como os quintetos estão relacionados Dados do usuário
Considere armazenar esse conjunto de dados para a tarefa acima:

Os dados em si são armazenados em quintetos de acordo com a estrutura que indica a associação em certos termos, na forma de um conjunto:

Vemos uma estrutura hierárquica familiar que é armazenada usando o método Lista de Adjacência.
Desempenho
O exemplo acima é muito simples, mas o que acontecerá quando a estrutura for milhares de vezes mais complexa e os dados tiverem gigabytes?
Vamos precisar de:
- A estrutura hierárquica considerada acima é de 1 pc.
- Árvore B para pesquisa por ID, pai e tipo - 3 peças.
Assim, todos os registros em nosso banco de dados serão indexados, incluindo dados e metadados. Essa indexação é necessária para preservar as propriedades de um banco de dados relacional - a ferramenta mais simples e popular. O índice pai é realmente composto (ID pai + tipo). Um índice por tipo também é composto (tipo + valor) para pesquisa rápida de objetos de um determinado tipo.
Os metadados nos permitem eliminar a recursão: por exemplo, para encontrar todos os detalhes de um determinado objeto, usamos o índice pelo ID pai. Se você precisar procurar objetos de um determinado tipo, será utilizado um índice por ID do tipo. Um tipo é um análogo de um nome de tabela e um campo em um DBMS relacional.

De qualquer forma, não analisamos todo o conjunto de dados e, mesmo com um grande número de valores de qualquer tipo, o valor desejado pode ser encontrado em um pequeno número de etapas.
A base para a plataforma de desenvolvimento
Por si só, esse banco de dados não é auto-suficiente para a programação de aplicativos e não é completo, como dizem, de acordo com Turing. Mas não estamos falando aqui apenas sobre o banco de dados, mas estamos tentando cobrir todos os aspectos: os objetos são, entre outras coisas, algoritmos de controle arbitrário que podem ser iniciados e eles funcionarão.
Como resultado, em vez de estruturas complexas de banco de dados e algoritmos de código-fonte armazenados separadamente, obtemos um campo de informação uniforme, limitado pelo volume da mídia e marcado com metadados. Os dados em si são apresentados ao usuário da maneira que ele entende - a estrutura da área de assunto e as entradas correspondentes nela. O usuário altera arbitrariamente a estrutura e os dados, inclusive fazendo operações em massa com eles.
Não inventamos nada de novo: todos os dados já estão armazenados no sistema de arquivos e a pesquisa neles é realizada usando árvores B, no sistema de arquivos, nos bancos de dados. Apenas reorganizamos a apresentação dos dados para tornar mais fácil e visual trabalhar com eles.
Para trabalhar com essa representação de dados, você precisará de um núcleo muito compacto - nosso mecanismo de banco de dados é uma ordem de magnitude menor que o BIOS do computador e, portanto, pode ser feito se não estiver em hardware, pelo menos o mais rápido e lambido possível. Por razões de segurança, também é somente leitura.
Adicionando uma nova classe à montagem do meu amado .Net, podemos observar a perda de 200 a 300 MB de RAM apenas para a descrição dessa classe. Esses megabytes não caberão no cache do nível correto, fazendo com que o sistema entre em confusão com as conseqüências resultantes. Uma situação semelhante ao Java. A descrição da mesma classe com quintetos levará dezenas ou centenas de bytes, pois a classe usa apenas truques primitivos para trabalhar com dados que já são familiares ao kernel.
Como lidar com diferentes formatos: RDBMS, NoSQL, bases de colunasA abordagem descrita abrange duas áreas principais: RDBMS e NoSQL. Ao resolver problemas que tiram proveito dos bancos de dados colunares, precisamos informar ao kernel que determinados objetos devem ser armazenados, levando em consideração a otimização da amostragem em massa dos valores de um determinado tipo de dados (nosso termo). Portanto, o kernel poderá colocar dados no disco da maneira mais lucrativa.
Assim, para uma base de colunas, podemos economizar significativamente o espaço ocupado por quintetos: use apenas um ou dois de seus componentes para armazenar dados úteis em vez de cinco e também use o índice apenas para indicar o início das cadeias de dados. Em muitos casos, apenas o índice será usado para amostras da nossa base de colunas analógicas, sem a necessidade de acessar os dados da própria tabela.
Note-se que a idéia não estabelece uma meta para coletar todos os desenvolvimentos avançados desses três tipos de bancos de dados. Pelo contrário, o mecanismo do novo sistema será reduzido o máximo possível, incorporando apenas o mínimo necessário de funções - tudo o que cobre as consultas DDL e DML no conceito descrito aqui.
Paradigma de programação
O uso da abordagem descrita não se limita apenas aos quintetos, mas promove um paradigma diferente daquele ao qual os programadores estão acostumados. Em vez de uma linguagem imperativa, declarativa ou de objeto, a linguagem de consulta é proposta como mais familiar aos seres humanos e nos permite definir a tarefa diretamente no computador, ignorando programadores e a camada impenetrável dos ambientes de desenvolvimento existentes.
Obviamente, na maioria dos casos, um tradutor de um idioma de usuário gratuito para um idioma de requisitos claros ainda será necessário.Este tópico será descrito em mais detalhes em artigos separados, com exemplos e desenvolvimentos existentes.
Então, resumindo, funciona da seguinte maneira:
- Uma vez descrevemos com tipos de dados primitivos de quintetos: string, número, arquivo, texto e outros, e também treinamos o kernel para trabalhar com eles. O treinamento é reduzido à apresentação correta dos dados e à implementação de operações simples com eles.
- Agora, descrevemos em quintetos os termos do usuário (tipos de dados) - na forma de metadados. A descrição se resume a especificar um tipo de dados primitivo para cada tipo de usuário e determinar a subordinação.
- Digite os quintetos de dados de acordo com a estrutura especificada pelos metadados. Cada quinteto de dados contém um link para seu tipo e pai, o que permite encontrá-lo rapidamente no armazém de dados.
- As tarefas principais se resumem a buscar dados e executar operações simples com eles para implementar algoritmos arbitrariamente complexos, descritos pelo usuário.
- O usuário gerencia dados e algoritmos usando uma interface visual que apresenta visualmente o primeiro e o segundo.
A integridade de todo o sistema é garantida pela incorporação dos requisitos básicos: o kernel pode executar operações seqüenciais, ramificar condicionalmente, processar conjuntos de dados e interromper o trabalho quando um determinado resultado é alcançado.
Para uma pessoa, o benefício é a simplicidade da percepção, por exemplo, em vez de declarar um ciclo envolvendo variáveis
for (i=0; i<length(A); i++) if A[i] meets a condition do something with A[i]
é usada uma construção mais amigável ao ser humano, como
with every A, that match a condition, do something
Sonhamos em abstrair das sutilezas de baixo nível da implementação de um sistema de informação: loops, construtores, funções, manifestos, bibliotecas - tudo isso ocupa muito espaço no cérebro de um programador, deixando pouco espaço para trabalho e desenvolvimento criativos.
Dimensionamento
Uma aplicação moderna é inconcebível sem meios de dimensionamento: é necessária uma capacidade ilimitada de expandir a capacidade de carga de um sistema de informação. Na abordagem descrita, tendo em vista a extrema simplicidade da organização dos dados, o dimensionamento acaba sendo organizado não mais complicado do que nas arquiteturas existentes.
No exemplo acima com aplicativos, você pode separá-los, por exemplo, por seu ID, criando a geração de ID com bytes altos fixos para diferentes servidores. Ou seja, ao usar 32 bits para armazenamento de ID, os dois, três ou quatro bits mais significativos, conforme necessário, indicarão o servidor no qual esses aplicativos estão armazenados. Assim, cada servidor terá seu próprio pool de IDs.
O núcleo de um único servidor pode funcionar independentemente de outros servidores, sem saber nada sobre eles. Ao criar um aplicativo, será dada alta prioridade ao servidor com o número mínimo de IDs usados, garantindo uma distribuição de carga uniforme.
Dado um conjunto limitado de possíveis variações de solicitações e respostas com uma única organização de dados, você precisará de um expedidor bastante compacto que distribua solicitações entre servidores e agregue seus resultados.