VMDS abrevia la tecnología de base de datos relacional llamada Version Managed Data Store proporcionada por GE Energy como parte de su plataforma tecnológica Smallworld y fue diseñada desde el principio para almacenar y analizar las redes espaciales y topológicas altamente complejas que suelen utilizar las empresas de servicios públicos como la distribución de energía y las telecomunicaciones. .
VMDS se introdujo originalmente en 1990 y se ha mejorado y actualizado a lo largo de los años. Su versión actual es 6.0.
VMDS ha sido diseñado como una base de datos espacial . Esto le da a VMDS una serie de características distintivas en comparación con las bases de datos relacionales de atributos convencionales.
Procesamiento de servidor distribuido
VMDS se compone de dos partes: un servidor de bloques de datos simple y altamente escalable llamado SWMFS (Smallworld Master File Server) y una API de cliente inteligente escrita en C y Magik . Los datos espaciales y de atributos se almacenan en bloques de datos que residen en archivos especiales llamados archivos de almacenamiento de datos en el servidor. Cuando la aplicación cliente solicita datos, tiene suficiente inteligencia para calcular el conjunto óptimo de bloques de datos que se requieren. Luego, esta solicitud se envía a SWMFS, que devuelve los datos al cliente a través de la red para su procesamiento.
Este enfoque es particularmente eficiente y escalable cuando se trata de datos espaciales y topológicos que tienden a fluir en volúmenes más grandes y requieren más procesamiento que los datos de atributos simples (por ejemplo, durante una operación de redibujo de mapas). Este enfoque hace que VMDS se adapte bien a la implementación empresarial que puede involucrar a cientos o incluso miles de clientes simultáneos.
Soporte para transacciones largas
Las bases de datos relacionales admiten transacciones cortas en las que los cambios en los datos son relativamente pequeños y breves en términos de duración (el período máximo entre el inicio y el final de una transacción suele ser de unos pocos segundos o menos).
VMDS admite transacciones largas en las que el volumen de datos involucrados en la transacción puede ser sustancial y la duración de la transacción puede ser significativa (días, semanas o incluso meses). Estos tipos de transacciones son comunes en aplicaciones de red avanzadas utilizadas, por ejemplo, por empresas de distribución de energía.
Debido al lapso de tiempo de una transacción larga en este contexto, la cantidad de cambio puede ser significativa (no solo dentro del alcance de la transacción, sino también dentro del contexto de la base de datos en su conjunto). En consecuencia, es probable que el mismo registro se cambie más de una vez. Para hacer frente a este escenario, VMDS tiene soporte incorporado para administrar automáticamente dichos conflictos y permite que las aplicaciones revisen los cambios y acepten solo las ediciones que sean correctas.
Capacidades espaciales y topológicas
Además de las funciones de bases de datos relacionales convencionales, como la consulta de atributos, los campos de combinación, los disparadores y los campos calculados, VMDS tiene numerosas capacidades espaciales y topológicas. Esto permite almacenar y analizar datos espaciales como puntos, textos, polilíneas, polígonos y datos ráster.
Las funciones espaciales incluyen: encontrar todas las características dentro de un polígono, calcular los polígonos de Voronoi de un conjunto de sitios y realizar un análisis de conglomerados en un conjunto de puntos.
A los datos espaciales vectoriales como puntos, polilíneas y polígonos se les pueden asignar atributos topológicos que permiten modelar redes complejas. Se proporcionan motores de análisis de red para responder preguntas como encontrar la ruta más corta entre dos nodos o cómo optimizar una ruta de entrega (el problema del viajante de comercio ). Un motor de topología se puede configurar con un conjunto de reglas que definen cómo las entidades topológicas interactúan entre sí cuando se agregan nuevos datos o se editan datos existentes.
Abstracción de datos
En VMDS, todos los datos se presentan a la aplicación como objetos. Esto es diferente de muchas bases de datos relacionales que presentan los datos como filas de una tabla o resultado de una consulta usando, por ejemplo, JDBC . VMDS proporciona una herramienta de modelado de datos y una infraestructura subyacente como parte de la plataforma tecnológica Smallworld que permite a los administradores asociar una tabla en la base de datos con un ejemplar (o clase) de Magik. Los métodos de obtención y configuración de Magik para el ejemplar de Magik se pueden generar automáticamente que exponen el campo (o columna) de una tabla. Cada fila de VMDS se manifiesta en la aplicación como una instancia de un objeto Magik y se conoce como RWO (u objeto del mundo real). Las tablas se conocen como colecciones en el lenguaje de Smallworld.
# all_rwos contiene todas las filas de la base de datos y es heterogéneo all_rwos << mi_aplicación.rwo_set () # valve_collection contiene la colección de válvulas válvulas << all_rwos.select (: colección, {: válvula}) number_of_valves << tamaño.válvulas
Las consultas se crean utilizando objetos predicados:
# encontrar válvulas 'abiertas'. open_valves << válvulas.select (predicate.eq (: operating_status, "open")) number_of_abiertas_valves << open_valves.size
_para válvula _sobre_válvulas_abiertas.elementos () _círculo escribir (valve.id) _endloop
Las uniones se implementan como métodos en el RWO principal. Por ejemplo, un gerente puede tener varios empleados que le reporten:
# obtener la colección de empleados. empleados << my_application.database.collection (: gis,: employee)
# busque un gerente llamado 'Steve' y obtenga el primer elemento coincidente steve << empleados.seleccionar (predicado.eq (: nombre, "Steve"). y (predicado.eq (: rol, "gerente")). an_element ()
# mostrar los nombres de sus subordinados directos. el nombre es un campo (o columna) # en la colección de empleados (o tabla) _para empleado _ sobre steve.direct_reports.elements () _círculo escribir (empleado.nombre) _endloop
Realización de una transacción:
# cada clave en la tabla hash corresponde al nombre del campo (o columna) en # la colección (o mesa) datos_válvula << tabla_hasta.nuevo_con ( : asset_id, 57648576, : material, "Hierro")
# obtener la colección de la válvula directamente valve_collection << my_application.database.collection (: gis,: valve)
# crear una transacción de inserción para insertar un nuevo registro de válvula en la colección a Se puede proporcionar un comentario que describa la transacción. transacción << record_transaction.new_insert (valve_collection, valve_data, "Insertó una nueva válvula") transaccion.run ()