Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2

Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2Primeros pasos: consulte la parte 1.

3. Variantes de estructuras al utilizar globales.

Una estructura como la de un árbol ordenado tiene varios casos especiales. Consideremos aquellos que tienen valor práctico cuando se trabaja con globales.

3.1 Caso especial 1. Un nodo sin ramas


Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2Los globales se pueden utilizar no sólo como una matriz, sino también como variables regulares. Por ejemplo, como contador:

Set ^counter = 0  ; установка счётчика
Set id=$Increment(^counter) ;  атомарное инкрементирование

En este caso, el global, además de su significado, también puede tener ramas. Uno no excluye al otro.

3.2 Caso especial 2. Un vértice y muchas ramas

En general, esta es una base clave-valor clásica. Y si guardamos una tupla de valores como valor, obtendremos una tabla muy común con una clave principal.

Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2

Para implementar una tabla sobre globales, tendremos que generar filas nosotros mismos a partir de los valores de las columnas y luego guardarlas en el global usando la clave principal. Para que sea posible volver a dividir la cadena en columnas durante la lectura, puede utilizar:

  1. caracteres delimitadores.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. un esquema rígido en el que cada campo ocupa un número predeterminado de bytes. Como se hace en las bases de datos relacionales.
  3. una función especial $LB (disponible en Cache), que crea una cadena de valores.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Curiosamente, no es difícil utilizar valores globales para hacer algo similar a los índices secundarios en bases de datos relacionales. Llamemos a estas estructuras índices globales. Un índice global es un árbol auxiliar para buscar rápidamente campos que no forman parte de la clave principal del global principal. Para completarlo y usarlo, necesita escribir código adicional.

Creemos un índice global en la primera columna.

Set ^i("col11", id1) = 1
Set ^i("col12", id2) = 1

Ahora, para buscar rápidamente información en la primera columna, tenemos que mirar la información global. ^i y busque las claves primarias (id) correspondientes al valor deseado de la primera columna.

Al insertar un valor, podemos crear inmediatamente tanto el valor como el índice global para los campos requeridos. Y para mayor confiabilidad, envolvamos todo en una transacción.

TSTART
Set ^t(id1) = $LB("col11", "col21", "col31")
Set ^i("col11", id1) = 1
TCOMMIT

Detalles sobre cómo hacerlo en M tablas sobre globales, emulación de índices secundarios.

Estas tablas funcionarán tan rápido como en las bases de datos tradicionales (o incluso más rápido) si las funciones para insertar/actualizar/eliminar filas se escriben en COS/M y se compilan.Verifiqué esta declaración con pruebas de INSERT y SELECT masivos en una tabla de dos columnas, incluido el uso de los comandos (transacciones) TSTART y TCOMMIT.

No he probado escenarios más complejos con acceso concurrente y transacciones paralelas.

Sin utilizar transacciones, la tasa de inserción fue de 778 inserciones/segundo por millón de valores.
Con 300 millones de valores - 422 inserciones/segundo.

Cuando se utilizan transacciones: 572 082 inserciones/segundo para 50 millones de inserciones. Todas las operaciones se realizaron a partir de código M compilado.
Los discos duros son normales, no SSD. RAID5 con escritura diferida. Procesador Phenom II 1100T.

Para probar una base de datos SQL de manera similar, necesita escribir un procedimiento almacenado que realizará inserciones en un bucle. Al probar MySQL 5.5 (almacenamiento InnoDB), usando este método recibí números de no más de 11K inserciones por segundo.
Sí, la implementación de tablas en globales parece más compleja que en bases de datos relacionales. Por lo tanto, las bases de datos industriales en globales tienen acceso SQL para simplificar el trabajo con datos tabulares.

Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2En general, si el esquema de datos no cambia con frecuencia, la velocidad de inserción no es crítica y toda la base de datos se puede representar fácilmente en forma de tablas normalizadas, entonces es más fácil trabajar con SQL, ya que proporciona un mayor nivel de abstracción. .

Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2En este caso particular quería mostrar que Los globales pueden actuar como constructor para crear otras bases de datos.. Como un ensamblador en el que se pueden escribir otros lenguajes. Aquí hay ejemplos de cómo se pueden crear análogos en globales. clave-valor, listas, conjuntos, tabulares, bases de datos orientadas a documentos.

Si necesita crear algún tipo de base de datos no estándar con un mínimo esfuerzo, entonces debería buscar las globales.

3.3 Caso especial 3. Árbol de dos niveles, cada nodo del segundo nivel tiene un número fijo de ramas

Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2Probablemente lo hayas adivinado: esta es una implementación alternativa de tablas en globales. Comparemos esta implementación con la anterior.

Tablas en un árbol de dos niveles vs. en un árbol de un solo nivel.

Contras
Pros

  1. Más lento para la inserción, ya que es necesario establecer el número de nodos igual al número de columnas.
  2. Más consumo de espacio en disco. Ya que los índices globales (entendidos como índices de matriz) con nombres de columnas ocupan espacio en el disco y se duplican para cada fila.

  1. Acceso más rápido a los valores de columnas individuales, ya que no es necesario analizar la cadena. Según mis pruebas, es un 11,5% más rápido en 2 columnas y más en un mayor número de columnas.
  2. Es más fácil cambiar el esquema de datos
  3. Código más claro

Conclusión: no para todos. Dado que la velocidad es uno de los beneficios más importantes de las variables globales, no tiene mucho sentido utilizar esta implementación, ya que lo más probable es que no funcione más rápido que las tablas en bases de datos relacionales.

3.4 Caso general. Árboles y árboles ordenados.

Cualquier estructura de datos que pueda representarse como un árbol encaja perfectamente con los globales.

3.4.1 Objetos con subobjetos

Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2

Ésta es el área de uso tradicional de los globales. En el campo de la medicina existe una gran cantidad de enfermedades, medicamentos, síntomas y métodos de tratamiento. Es irracional crear una tabla con un millón de campos para cada paciente. Además, el 99% de los campos estarán vacíos.

Imagine una base de datos SQL de tablas: "paciente" ~ 100 campos, "Medicina" - 000 campos, "Terapia" - 100 campos, "Complicaciones" - 000 campos, etc. etcétera. O puede crear una base de datos de miles de tablas, cada una para un tipo específico de paciente (¡y pueden superponerse!), tratamientos, medicamentos y miles de tablas más para las conexiones entre estas tablas.

Los globales son ideales para la medicina, ya que permiten crear para cada paciente una descripción precisa de su historial médico, diversas terapias y las acciones de los medicamentos, en forma de árbol, sin desperdiciar espacio extra en el disco en columnas vacías, como lo haría ser el caso en un caso relacional.

Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2Usando globales es conveniente crear una base de datos con datos sobre personas, cuando es importante acumular y sistematizar un máximo de información diversa sobre el cliente. Esto tiene demanda en medicina, banca, marketing, archivos y otras áreas.

.
Por supuesto, en SQL también puedes emular un árbol con sólo unas pocas tablas (EAV, 1,2,3,4,5,6,7,8,9,10), sin embargo, esto es mucho más complicado y será más lento. Esencialmente, tendrías que escribir un global que funcione en tablas y ocultar todo el trabajo con tablas bajo una capa de abstracción. Es incorrecto emular tecnología de nivel inferior (globales) utilizando tecnología de nivel superior (SQL). Inadecuado.

No es ningún secreto que cambiar el esquema de datos en tablas gigantes (ALTER TABLE) puede llevar bastante tiempo. MySQL, por ejemplo, ALTER TABLE ADD|DROP COLUMN copia completamente la información de la tabla antigua a la nueva (motores MyISAM e InnoDB probados). Lo que puede bloquear una base de datos funcional con miles de millones de registros durante días, si no semanas.

Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2Cambiar la estructura de datos si usamos globales no nos cuesta nada. En cualquier momento podemos agregar cualquier propiedad nueva que necesitemos a cualquier objeto, en cualquier nivel de la jerarquía. Los cambios asociados con el cambio de nombre de las ramas se pueden ejecutar en segundo plano en una base de datos en ejecución.


Por lo tanto, cuando se trata de almacenar objetos con una gran cantidad de propiedades opcionales, los globales son una excelente opción.

Además, déjame recordarte que el acceso a cualquiera de las propiedades es instantáneo, ya que en el global todas las rutas son árboles B.

Las bases de datos globales, en general, son un tipo de base de datos orientada a documentos con capacidad para almacenar información jerárquica. Por lo tanto, las bases de datos orientadas a documentos pueden competir con las globales en el campo del almacenamiento de registros médicos. Pero todavía no es lo mismoTomemos MongoDB para comparar. en este dominio pierde frente a los globales por las siguientes razones:

  1. Tamaño del documento. La unidad de almacenamiento es texto en formato JSON (más precisamente BSON) con un volumen máximo de unos 16 MB. La restricción se hizo específicamente para que la base de datos JSON no se ralentice durante el análisis si se almacena un documento JSON enorme y luego se accede a él mediante campos. Este documento debe contener toda la información sobre el paciente. Todos sabemos lo gruesos que pueden ser los registros de los pacientes. El tamaño máximo de tarjeta de 16 MB pone fin inmediatamente a los pacientes cuya tarjeta de enfermedad incluye archivos de resonancia magnética, exploraciones de rayos X y otros estudios. En una rama del global puedes tener gigabytes y terabytes de información. En principio podemos poner fin a esto, pero continuaré.
  2. Tiempo de conciencia/cambio/eliminación de nuevas propiedades en el expediente del paciente. Una base de datos de este tipo debe leer el mapa completo en la memoria (¡esto es una gran cantidad!), analizar BSON, agregar/cambiar/eliminar un nuevo nodo, actualizar índices, empaquetarlo en BSON y guardarlo en el disco. Un global sólo necesita acceder a una propiedad específica y manipularla.
  3. Acceso rápido a propiedades individuales. Con muchas propiedades en un documento y su estructura de múltiples niveles, el acceso a las propiedades individuales será más rápido debido al hecho de que cada ruta en el global es un árbol B. En BSON, debe analizar linealmente el documento para encontrar la propiedad deseada.

3.3.2 Matrices asociativas

Los arreglos asociativos (incluso con arreglos anidados) encajan perfectamente en los globales. Por ejemplo, una matriz de este tipo de PHP se mostrará en la primera imagen 3.3.1.

$a = array(
  "name" => "Vince Medvedev",
  "city" => "Moscow",
  "threatments" => array(
    "surgeries" => array("apedicectomy", "biopsy"),
    "radiation" => array("gamma", "x-rays"),
    "physiotherapy" => array("knee", "shoulder")
  )
);

3.3.3 Documentos jerárquicos: XML, JSON

También se almacena fácilmente en globales. Se puede disponer de diferentes formas para su almacenamiento.

XML
La forma más sencilla de descomponer XML en globales es almacenar atributos de etiquetas en nodos. Y si se necesita un acceso rápido a los atributos de las etiquetas, podemos moverlos a ramas separadas.

Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2

<note id=5>
<to>Вася</to>
<from>Света</from>
<heading>Напоминание</heading>
<body>Позвони мне завтра!</body>
</note>

En COS esto correspondería al código:

Set ^xml("note")="id=5"
Set ^xml("note","to")="Саша"
Set ^xml("note","from")="Света"
Set ^xml("note","heading")="Напоминание"
Set ^xml("note","body")="Позвони мне завтра!"

Nota: Para XML, JSON y matrices asociativas, puede encontrar muchas formas diferentes de visualización en globales. En este caso, no reflejamos el orden de las subetiquetas en la etiqueta de nota. Globalmente ^xml Las subetiquetas se mostrarán en orden alfabético. Para reflejar estrictamente el orden, puede utilizar, por ejemplo, la siguiente pantalla:

Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2
JSON.
La primera imagen de la sección 3.3.1 muestra un reflejo de este documento JSON:

var document = {
  "name": "Vince Medvedev",
  "city": "Moscow",
  "threatments": {
    "surgeries": ["apedicectomy", "biopsy"],
    "radiation": ["gamma", "x-rays"],
    "physiotherapy": ["knee", "shoulder"]
  },
};

3.3.4 Estructuras idénticas conectadas por relaciones jerárquicas

Ejemplos: la estructura de las oficinas de ventas, la ubicación de las personas en una estructura MLM, la base de datos de aperturas en ajedrez.

Estrena base de datos. Puede utilizar la estimación de la fuerza de carrera como valor de índice del nodo global. Luego, para elegir el movimiento más fuerte, bastará con elegir la rama de mayor peso. En el nivel global, todas las ramas de cada nivel se ordenarán según la fuerza del movimiento.

Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2

La estructura de las oficinas de ventas, la estructura de personas en MLM. Los nodos pueden almacenar ciertos valores de almacenamiento en caché que reflejan las características de todo el subárbol. Por ejemplo, el volumen de ventas de un subárbol determinado. En cualquier momento podremos obtener una cifra que refleje los logros de cualquier rama.

Los globales son espadas-tesoros para almacenar datos. Árboles. Parte 2

4. ¿En qué casos es más beneficioso utilizar globales?

La primera columna presenta casos en los que obtendrá una ganancia de velocidad significativa mediante el uso de variables globales, y la segunda, en los que se simplificará el diseño o el modelo de datos.

velocidad
Facilidad de procesamiento/presentación de datos

  1. Inserción [con clasificación automática en cada nivel], [indexación por clave maestra]
  2. Eliminando subárboles
  3. Objetos con muchas propiedades anidadas que requieren acceso individual
  4. Estructura jerárquica con la capacidad de omitir ramas secundarias de cualquier rama, incluso las inexistentes.
  5. Recorrido en profundidad de subárboles
  1. Objetos/entidades con una gran cantidad de propiedades/entidades opcionales [y/o anidadas]
  2. Datos sin esquemas. Cuando muchas veces pueden aparecer nuevas propiedades y desaparecer las antiguas.
  3. Necesita crear una base de datos personalizada.
  4. Bases de rutas y árboles de decisión. Cuando conviene representar caminos como un árbol.
  5. Eliminar estructuras jerárquicas sin utilizar recursividad

Extensión “Los globales son espadas-tesoro para almacenar datos. Conjuntos dispersos. Parte 3".

Observación: Este artículo y mis comentarios son mi opinión y no tienen relación con la posición oficial de InterSystems Corporation.

Fuente: habr.com

Añadir un comentario