Quinteto en lugar de Byte: enfoque de almacenamiento y recuperación de datos

Quintet es una forma de presentar datos atómicos que indican su papel en el área de negocios. Los quintetos pueden describir cualquier elemento, mientras que cada uno de ellos contiene información completa sobre sí mismo y sus relaciones con otros quintetos. Dicha descripción no depende de la plataforma utilizada. Su objetivo es simplificar el almacenamiento de datos y mejorar la visibilidad de su presentación.



Discutiremos un enfoque para almacenar y procesar información y compartiremos algunas ideas sobre la creación de una plataforma de desarrollo en este nuevo paradigma. Para que Para desarrollar más rápido y en iteraciones más cortas: bosqueje su proyecto, asegúrese de que sea lo que pensaba, refínelo y luego siga refinando el resultado.

El quinteto tiene propiedades: tipo, valor, padre y orden entre los pares. Por lo tanto, hay 5 componentes que incluyen el identificador. Esta es la forma universal más simple para registrar información, un nuevo estándar que podría adaptarse a cualquier demanda de programación. Los quintetos se almacenan en el sistema de archivos de la estructura unificada, en un volumen de datos indexado homogéneo continuo. El modelo de datos de quinteto: un modelo de datos que describe cualquier estructura de datos como una sola lista interconectada de tipos básicos y términos basados ​​en ellos (metadatos), así como instancias de objetos almacenados de acuerdo con estos metadatos (datos).

Medio minuto de letras
Hoy en día hay un número infinito de estándares para registrar datos, numerosos enfoques y reglas, cuyo conocimiento es necesario para trabajar con estos registros. Las normas se describen por separado y no se relacionan directamente con los datos correspondientes. En el caso de los quintetos, al tomar cualquiera de ellos, puede obtener información relevante sobre su naturaleza, propiedades y reglas de procesamiento en el área comercial del usuario. Su estándar es unificado y fijo para todas las áreas. El quinteto está oculto para el usuario: los metadatos y los datos están disponibles para este último de una manera común y comprensible.

Quintet no es solo información, también podría representar código ejecutable. Pero, sobre todo, son los datos que desea registrar, almacenar y recuperar. Dado que en nuestro caso los quintetos son directamente direccionables, interconectados e indexados, los almacenaremos en una especie de base de datos.


¿Por qué Quinteto en lugar de Byte?


No es un bit o un impulso electrónico que orienta el giro magnético.

Estamos acostumbrados a medir los datos en bytes, ya sea un tamaño de documento o foto, límite de tráfico de Internet o espacio disponible en su dispositivo móvil. Proponemos otra medida, Quintet, que no tiene un tamaño fijo como Byte, pero representa una cantidad atómica de datos, que es de algún valor para el usuario.

Por ejemplo, puede decir que su base de datos ocupa 119 megabytes del almacenamiento o puede indicar que esta base de datos almacena 1.37 mega-quintetos. No le importa mucho qué es un byte en este contexto, pero comprende que esta base de datos contiene 1,37 millones de sus descripciones de términos, objetos, sus atributos, enlaces, eventos, consultas con sus detalles, etc. Tener 1,37 millones de datos valiosos suena más sexy que tener 119 megabytes de cosas contigo.

Por lo tanto, esto no es para reemplazar la forma en que se almacena la información en el medio de datos, sino para cambiar a otro nivel de abstracción.

Estructura de quinteto


La idea principal de este artículo es reemplazar los tipos de máquina con términos humanos y reemplazar las variables con objetos. No por aquellos objetos que necesitan un constructor, destructor, interfaces y un recolector de basura, sino por unidades de información cristalinas que maneja un cliente. Es decir, si el cliente dice "Cliente", guardar la esencia de esta declaración en el medio no requeriría la experiencia de un programador.



Tiene sentido centrar la atención del usuario solo en el valor del objeto, mientras que su tipo, padre, orden (entre iguales en subordinación) e identificador deben ser obvios por el contexto o simplemente ocultos. Esto significa que el usuario no sabe nada sobre quintetos, simplemente entrega una tarea, se asegura de que se acepte correctamente y luego comienza su ejecución.

Conceptos basicos


Hay un conjunto de tipos de datos que todos entienden: cadena, número, archivo, texto, fecha, etc. Un conjunto tan simple es suficiente para esbozar la solución y "programarla" junto con los términos necesarios para su implementación. Los tipos básicos representados por quintetos pueden verse así:



En este caso, algunos de los componentes del quinteto no se usan, mientras que el quinteto en sí se usa como tipo básico. Esto hace que el núcleo del sistema sea más fácil de navegar al recopilar metadatos.

El fondo


Debido a la brecha analítica entre el usuario y el programador, se produce una deformación significativa de los conceptos en la etapa de delinear un proyecto. La subestimación, la incomprensibilidad y la iniciativa no solicitada a menudo convierten una idea simple y razonable del cliente en un desastre lógicamente imposible, si se evalúa desde el punto de vista del usuario.



La transferencia de conocimiento debe ocurrir sin pérdida y distorsión. Además, al organizar el almacenamiento de este conocimiento, debe deshacerse mejor de las restricciones impuestas por el sistema de gestión de datos elegido.

Cómo almacenamos los datos ahora


Por lo general, hay muchas bases de datos en el servidor; cada uno de ellos contiene una descripción del esquema de datos con un conjunto específico de detalles: datos interconectados lógicamente. Se almacenan en el medio de datos en un orden específico, idealmente: óptimo para reducir los esfuerzos de recuperación.
El sistema de almacenamiento de información propuesto es un compromiso entre varios métodos bien conocidos: orientado a columnas, relacional y NoSQL. Está diseñado para resolver las tareas que generalmente realiza uno de estos enfoques.

Por ejemplo, la teoría del DBMS orientado a columnas se ve hermosa: leemos solo la columna deseada, pero no todas las filas de registros en su conjunto. Sin embargo, en la práctica, es poco probable que los datos se coloquen en los medios para que sea conveniente recuperar docenas de diferentes dimensiones analíticas. Tenga en cuenta que los atributos y las métricas analíticas se pueden agregar y eliminar, a veces más rápido de lo que podemos reconstruir nuestro almacenamiento en columnas. Sin mencionar que los datos en la base de datos pueden modificarse, lo que también violará la belleza del esquema de almacenamiento debido a la fragmentación inevitable.

Metadatos


Introdujimos un concepto, un término, para describir cualquier objeto con el que operamos: entidad, propiedad, solicitud, archivo, etc. Definiremos todos los términos que usamos en nuestra área de negocios. Y con su ayuda, describiremos todas las entidades que tienen detalles, incluida la forma de las relaciones entre entidades. Por ejemplo, un atributo: un enlace a una entrada del diccionario de estado. El término se escribe como un quinteto de datos.

Un conjunto de descripciones de términos son metadatos como los mismos representados por la estructura de tablas y campos en una base de datos normal. Por ejemplo, existe la siguiente estructura de datos: una solicitud de servicio en una fecha que tiene el contenido (descripción de la solicitud) y un estado, al que los participantes de un proceso de producción agregan comentarios que indican la fecha. En un constructor de base de datos tradicional se verá más o menos así:



Dado que decidimos ocultar al usuario todos los detalles no esenciales, como las ID de enlace, por ejemplo, el esquema se simplificará un poco: se eliminan las menciones de ID y se combinan los nombres de entidades y sus valores clave.

El usuario "dibuja" la tarea: una solicitud de la fecha de hoy que tiene un estado (valor de referencia) y al que puede agregar comentarios que indican la fecha:



Ahora vemos 6 campos de datos diferentes en lugar de 9, y todo el esquema nos ofrece leer y comprender 7 palabras en lugar de 13. Aunque, por supuesto, esto no es lo principal.

Los siguientes son los quintetos generados por el núcleo de procesamiento de quintetos para describir esta estructura:



Se proporcionan explicaciones en lugar de los valores de quinteto resaltados en gris para mayor claridad. Estos campos no se completan, porque toda la información necesaria está determinada inequívocamente por los componentes restantes.

Vea cómo se relacionan los quintetos


Lo que tenemos aquí:

  • los atributos con los ID 80, 81, 83 tienen el mismo padre - Solicitud
  • el quinteto # 82 es el atributo de Comentario, que a su vez es un atributo de Solicitud
  • el atributo # 74 es una referencia al tipo descrito por el quinteto # 73 y se usa como el atributo # 81 de Solicitud

Esto puede parecer un poco complicado para los humanos, pero la buena noticia es que un humano nunca verá esto. El núcleo representará los metadatos como diagramas comprensibles y los datos como tablas planas simples.

Datos del usuario


Permítanme mostrar cómo almacenamos un conjunto de datos para la tarea anterior:



Los datos en sí se almacenan en quintetos de acuerdo con los metadatos. Podemos visualizarlos de la misma manera que lo hicimos anteriormente:



Vemos una estructura jerárquica familiar escrita usando algo como el método de Lista de adyacencia.

Almacenamiento físico


Los datos se escriben en la memoria como una secuencia de elementos de quinteto en bytes de datos. Para buscar por índice, el núcleo trata esos bytes de datos de acuerdo con el tipo de datos definido para ellos por tipos básicos.
Eso es todo: una gran lista de cinco elementos de datos.

Los principios de almacenamiento no son muy diferentes de los mismos en RDBMS, lo que nos permite construir consultas SQL a los datos para realizar la recuperación de datos, JOIN, funciones agregadas y otras cosas que nos gustan en las bases de datos relacionales.
Para probar el prototipo de una plataforma de desarrollo basada en el sistema de almacenamiento de quintetos, utilizamos una base de datos relacional.

Rendimiento


El ejemplo anterior es muy simple, pero ¿qué será cuando la estructura sea mil veces más compleja y haya gigabytes de datos?

Lo que necesitamos

  1. La estructura jerárquica discutida - 1 pc.
  2. B-tree para buscar por ID, padre y tipo - 3 piezas.

Por lo tanto, todos los registros en nuestra base de datos serán indexados, incluidos los datos y metadatos. Dicha indexación es necesaria para obtener los beneficios de una base de datos relacional, la herramienta más simple y popular. El índice principal es en realidad compuesto (ID principal + tipo). El índice por tipo también es compuesto (tipo + valor) para la búsqueda rápida de objetos de un tipo dado.

Los metadatos nos permiten deshacernos de la recursividad: por ejemplo, para encontrar todos los detalles de un objeto determinado, utilizamos el índice por ID principal. Si necesita buscar objetos de cierto tipo, entonces usamos el índice por ID de tipo. Tipo es un análogo de un nombre de tabla y un campo en un DBMS relacional.



En cualquier caso, no escaneamos todo el conjunto de datos, e incluso con una gran cantidad de valores de cualquier tipo, el valor deseado se puede encontrar en una pequeña cantidad de pasos.

La base de la plataforma de desarrollo.


De por sí, dicha base de datos no es autosuficiente para la programación de aplicaciones y no está completa, como dicen, según Turing. Sin embargo, estamos hablando aquí no solo de la base de datos, sino que estamos tratando de cubrir todos los aspectos: los objetos son, entre otras cosas, algoritmos de control arbitrarios que se pueden iniciar y funcionarán.

Como resultado, en lugar de estructuras de bases de datos complejas y algoritmos de código fuente de control almacenados por separado, obtenemos un campo de información uniforme, limitado por el volumen del espacio de almacenamiento y gobernado con metadatos. Los datos en sí se presentan al usuario en una forma comprensible para él: la estructura del área temática y las entradas correspondientes en ella. El usuario cambia arbitrariamente la estructura y los datos, incluida la realización de operaciones masivas con ellos.

No inventamos nada nuevo: todos los datos ya están almacenados en el sistema de archivos y la búsqueda en ellos se realiza utilizando árboles B, ya sea en el sistema de archivos o en la base de datos. Acabamos de reorganizar la presentación de los datos para que sea más fácil y claro trabajar con ellos.



Para trabajar con esta representación de datos, necesitará un software de kernel muy compacto: nuestro motor de base de datos es del tamaño más pequeño que el BIOS de una computadora y, por lo tanto, se puede hacer si no en hardware, al menos tan rápido y con errores. gratis como sea posible Por razones de seguridad, también podría ser de solo lectura.

Al agregar una nueva clase a un ensamblaje en mi .Net favorito, podemos observar la pérdida de 200-300 MB de RAM solo en la definición de esta clase. Estos megabytes no caben en el caché del nivel adecuado, lo que hace que el sistema se intercambie en el disco con toda la sobrecarga consecuente. Una situación similar es con Java. La descripción de la misma clase con quintetos tomará decenas o cientos de bytes, ya que la clase usa solo operaciones primitivas para trabajar con datos que el núcleo ya conoce.

Puede pensar que este enfoque ya se implementa muchas veces en varias aplicaciones, pero eso no es cierto.


Hicimos una búsqueda profunda en las bases de Internet y de propiedad intelectual (patentes), y nadie afirma hacer exactamente la misma solución para romper el límite de rendimiento de los constructores, las soluciones de mesa única y otros sistemas basados ​​en EAV. Sin embargo, pusimos cientos de gigabytes en dicha aplicación de quinteto y descubrimos que funciona bastante bien. En caso de que quiera ver evidencias, crear y probar su propia instancia, no dude en visitar nuestra cuenta de github.

El prototipo de la plataforma que construimos tiene cuatro componentes:

  1. Editor de tipo visual para definir los metadatos
  2. Herramienta de navegación de datos como un simple navegador SQL
  3. Diseñador de informes visuales para crear consultas SQL a los datos
  4. Un procesador de plantillas para combinar plantillas con datos recuperados por consultas



Como se pretendía, al trabajar con el prototipo, ningún usuario pensaría que hay quintetos en su interior; esto se parece a un constructor ordinario.

Cómo lidiar con diferentes formatos: RDBMS, NoSQL, bases de columnas
El enfoque discutido cubre dos áreas principales: RDBMS y NoSQL. Al resolver problemas que aprovechan las bases de datos en columnas, debemos decirle al núcleo que ciertos objetos deben almacenarse, teniendo en cuenta la optimización del muestreo en masa de los valores de un determinado tipo de datos (nuestro término). Por lo tanto, el núcleo podrá colocar datos en el disco de la manera más rentable.

Por lo tanto, para una base de datos columnar, podemos ahorrar significativamente el espacio ocupado por los quintetos: use solo uno o dos de sus componentes para almacenar datos útiles en lugar de cinco, y también use el índice solo para indicar el comienzo de las cadenas de datos. En muchos casos, solo el índice se utilizará para tomar muestras de nuestro análogo de una base columnar, sin la necesidad de acceder a los datos de la lista de quintetos.

Cabe señalar que la idea no pretende recopilar todos los desarrollos avanzados de estos tres tipos de bases de datos. Por el contrario, el motor del nuevo sistema se reducirá tanto como sea posible, incorporando solo el mínimo necesario de funciones, todo lo que cubre las solicitudes DDL y DML en el concepto descrito aquí.


Paradigma de programación


El enfoque descrito no se limita solo al uso de quintetos, sino que promueve un paradigma diferente al que los programadores están acostumbrados. En lugar de un lenguaje imperativo, declarativo u objeto, proponemos que el lenguaje de consulta sea más familiar para los humanos y nos permita establecer la tarea directamente en la computadora, evitando los programadores y la capa impenetrable de los entornos de desarrollo existentes.

Por supuesto, en la mayoría de los casos aún será necesario un traductor de un lenguaje de usuario laico a un lenguaje de requisitos claros.

Este tema se describirá con más detalle en artículos separados con ejemplos y desarrollos existentes.

Entonces, en breve, funciona de la siguiente manera:

  1. Una vez describimos los tipos de datos primitivos usando quintetos: cadena, número, archivo, texto y otros, y también capacitamos al núcleo para trabajar con ellos. La capacitación significa la presentación correcta de los datos y la implementación de operaciones simples con ellos.
  2. Ahora describimos los términos del usuario (tipos de datos), en forma de metadatos. La descripción solo especifica un tipo de datos primitivo para cada tipo de usuario y determina las relaciones.
  3. Ingresamos quintetos de datos de acuerdo con la estructura especificada por los metadatos. Cada quinteto de datos contiene un enlace a su tipo y padre, que le permite encontrarlo rápidamente en el almacenamiento de datos.
  4. Las tareas del núcleo se reducen a buscar datos y realizar operaciones simples con ellos para implementar algoritmos arbitrariamente complejos definidos por el usuario.
  5. El usuario gestiona datos y algoritmos utilizando una interfaz visual que los presenta a ambos.


La integridad de Turing de todo el sistema está garantizada por la realización de los requisitos básicos: el núcleo puede realizar operaciones secuenciales, ramificar condicionalmente, procesar los datos y detener el trabajo cuando se logra un cierto resultado.

Para una persona, el beneficio es la simplicidad de la percepción, por ejemplo, en lugar de declarar un ciclo que involucra variables

for (i = 0; i <length (A); i ++) if A [i] meets a condition do something with A [i] 


se usa una forma más comprensible, como

 with every A, that match a condition, do something 


Soñamos con abstraernos de las sutilezas de bajo nivel de los sistemas de información: bucles, constructores, funciones, manifiestos, bibliotecas: todo esto ocupa demasiado espacio en el cerebro de un programador, dejando poco espacio para el trabajo creativo y el desarrollo.

Escalabilidad


Una aplicación a menudo es inútil sin medios de escalado: se requiere una capacidad ilimitada para expandir la capacidad de carga de un sistema de información. En el enfoque descrito, teniendo en cuenta la extrema simplicidad de la organización de datos, el escalado resulta ser organizado no más complicado que en las arquitecturas existentes.

En el ejemplo anterior con las solicitudes de servicio, puede separarlas, por ejemplo, por su ID, haciendo que la generación de ID con bytes ALTOS fijos para diferentes servidores. Es decir, cuando se usan 32 bits para almacenar ID, los dos, tres, cuatro o más bits izquierdos, según sea necesario, indicarán el servidor en el que se almacenan estas aplicaciones. Por lo tanto, cada servidor tendrá su propio grupo de ID.

El núcleo de un solo servidor puede funcionar independientemente de otros servidores, sin saber nada sobre ellos. Al crear un objeto, se le dará una alta prioridad al servidor con el número mínimo de ID utilizados, para garantizar la distribución uniforme de la carga.

Dado un conjunto limitado de posibles variaciones de solicitudes y respuestas en dicha organización de datos, necesitará un despachador bastante compacto que distribuya las solicitudes entre los servidores y agregue sus resultados.

Source: https://habr.com/ru/post/468927/


All Articles