Noticias Programación

Exploración esquemática del mundo real con Azimutt

Azimutt es un explorador de esquemas de base de datos gratuito y de código abierto con muchas características excelentes. Lo puse a prueba al diseñar una aplicación Spring Boot. Esto es lo que encontré.


La funcionalidad central de Azimutt le permite explorar su esquema buscando tablas relevantes, siguiendo relaciones e incluso encontrando rutas entre las tablas que desea conectar. Está basado en la web y, como tal, se ejecuta dentro del navegador, por lo que no hay binarios separados para descargar e instalar, lo que lo hace portátil.

Mi descubrimiento de Azimutt se produjo en un momento crucial durante el desarrollo de una aplicación Spring Boot. Para configurar la escena, la aplicación interactúa con un servicio web SOAP y utiliza Hibernate para almacenar los datos que consume. Además, la interfaz de usuario está escrita en Vaadin.

Sin embargo, el esquema XML proporcionado por el extremo SOAP era muy complejo, ya que contenía muchas entidades y relaciones entre ellas. Para obtener más información sobre el esquema XML, se hizo un primer intento de visualizarlo probando un conjunto de herramientas y obteniendo este laberinto:

Intento decente, pero a partir de este diagrama realmente no se puede distinguir nada, incluso cuando está completamente expandido.

Probemos otra cosa. Debido a que el esquema es demasiado complejo y grande, generar código utilizando el potente complemento de Java Hyperjaxb fue una bendición. Por lo tanto, este esquema XML se usó más tarde como una plantilla que se insertó en hyperjaxb para generar las Entidades, junto con sus anotaciones JAXB y JPA y las relaciones asignadas. Se necesitaba JAXB para ordenar los paquetes XML SOAP hacia y desde las estructuras de datos y JPA para asignarlos a las tablas de la base de datos y habilitar las capacidades de ORM.

Un ejemplo de una entidad central para el esquema generado por Hyperjaxb es «Obtener factura«:

@Entidad (nombre = «Obtener factura»)
@Tabla (nombre = «FACTURA_OBTENER»)
@ Herencia (estrategia = InheritanceType.JOINED)

clase pública FacturaObtener
implementa Serializable, Equals, HashCode
{

protegido String número de factura;
código de cadena protegido;
@XmlSchemaType (nombre = «fechaHora»)
XMLGregorianCalendar protegido fecha de emisión;
Referencia de comprador de cadena protegida;
Cadena protegida projectReferenceId;
Cadena protegida contractReferenceId;
….

@XmlAttribute (nombre = «Hjid»)
protegido a lo largo de hjid;
….
….
@ManyToOne (targetEntity = AllowanceChargeGetList.class, fetch = FetchType.EAGER, cascade = {
CascadeType.TODO
})
@JoinColumn (nombre = «ALLOWANCE_CHARGE_LIST_INVOIC_1»)
Public AllowanceChargeGetList getAllowanceChargeList () {
Lista de cargos de asignación de devolución;
}

que, como se puede ver en el informe, está asignado a otra entidad AsignaciónCargoObtenerLista por FK

AsignaciónCargoObtenerLista
@Entidad (nombre = «AllowanceChargeGetList»)
@Tabla (nombre = «ALLOWANCE_CHARGE_GET_LIST»)
@ Herencia (estrategia = InheritanceType.JOINED)

@OneToMany (targetEntity = AllowanceChargeGet.class, fetch = FetchType.EAGER, cascade = {
CascadeType.TODO
})
@Fetch (valor = FetchMode.SUBSELECT)
@JoinColumn (nombre = «BAJAS_CARGOS_BAJAS_1»)
lista pública obtenerCargosPermisos () {
if (asignacionesCargos == nulo) {
cotizarCargos = new ArrayList();
}
devuelve este.cargos de las asignaciones;
}

que a su vez se asigna a otra entidad, SubsidioCargoObtener

SubsidioCargoObtener
@Entidad (nombre = «AllowanceChargeGet»)
@Tabla (nombre = «PERMISO_CARGO_OBTENER»)
@ Herencia (estrategia = InheritanceType.JOINED)
clase pública AllowanceChargeGet
implementa Serializable, Equals, HashCode
{

cantidad pública BigDecimal;
Cantidad base BigDecimal protegida;
Porcentaje BigDecimal protegido;
protegido String IVACategoryCode;
Tasa de IVA BigDecimal protegida;
Patrón de cuerda protegido;
Cadena protegida código de motivo;
Indicador de carga booleano protegido;
protegido StringamountCurrencyId;
Cadena protegida baseAmountCurrencyId;
cadena protegida taxSchemeId;
@XmlAttribute (nombre = «Hjid»)
protegido a lo largo de hjid;

Y la historia continua. En general, fue muy difícil visualizar lo que sucede con solo leer el código, dados los nombres de las tablas unitarias y estrechamente relacionadas.

Sin embargo, dado que Hibernate auto-ddl creó tablas y sus construcciones de relación como claves externas, puede apuntar su herramienta de desarrollo de SQL favorita, como Oracle SQL Developer, a su base de datos para navegar gráficamente por las relaciones. Este fue el resultado de una de estas herramientas:

Todavía no satisfecho.

En este punto, la verdad es que, dado que he creado las tablas y sus relaciones en la base de datos, navegar por el esquema no sería imperativo ya que Hibernate se encarga de ello. Sin embargo, hay dos problemas con esta declaración. En primer lugar, debe conocer su patrón para la optimización y la solución de problemas y, en segundo lugar, los colegas se acercan y preguntan «¿cómo se relaciona esta tabla entre sí?»
porque después del lanzamiento de la aplicación, será necesario integrar las aplicaciones periféricas antes de la misma. Por lo tanto, debe conocer su esquema para realizar los cambios.

Así que la investigación continuó. Buscando una buena herramienta no encontraba una que fuera portable y fácil de usar, propiedades necesarias para comunicarme eficientemente con terceros. Y luego, de repente, mi notificación de Twitter se encendió. Me siguió Azimutt. ¿Qué era Azimutt? ¡»Explora el esquema de tu base de datos SQL» estaba escrito en su perfil! Mi primer pensamiento fue «¿Me están mirando?», El siguiente fue «Vamos a intentarlo». Y me alegré mucho de haberlo hecho.

Sin embargo, para usarlo, tuve que alimentarlo de alguna manera con mi patrón. Hibernate vino al rescate nuevamente ya que Hibernate también puede generar el SQL DDL. Un ejemplo de lo que obtuve fue:

crear factura table_get (
número hjid (19,0) no nulo,
comprador_electronic_address_id varchar2 (255 caracteres),
legal_comprador nombre varchar2 (255 caracteres),
comprador_legal_registración_id varchar2 (255 caracteres),
comprador_fiesta_id varchar2 (255 caracteres),
referencia_comprador varchar2 (255 caracteres),
comprador_impuesto_número varchar2 (255 caracteres),
comprador_comercio_nombre varchar2 (255 caracteres),
contract_reference_id varchar2 (255 caracteres),
….
clave principal (hjid)
);

crear tabla Allow_charge_get_list (
número hjid (19,0) no nulo,
clave principal (hjid)
);

crear tabla Allow_charge_get (
número hjid (19,0) no nulo,
número de cantidad (20,10),
cantidad_valor_id varchar2 (255 caracteres),
número base_amount (20,10),
base_amount_currency_id varchar2 (255 caracteres),
número de indicador de carga (1,0),
número de porcentaje (20.10),
patrón varchar2 (255 caracteres),
código_motivacional varchar2 (255 caracteres),
tax_scheme_id varchar2 (255 caracteres),
vat_category_code varchar2 (255 caracteres),
número de IVA (20,10),
allow_charges_indemnity_1 número (19.0),
clave principal (hjid)
);

altera la tabla de factura_obtener
agregar restricción FK8nuo69gnpvxe02hdnqul5h86y
clave externa (allowance_charge_list_invoic_1)
se refiere a indemnity_debito_get_list;

altera la tabla Allow_charge_get
agregar restricción FKhgf0f8q6e7cdterrpmyx2k6i4
clave externa (permisos_cargos_permiso_1)
se refiere a indemnity_debito_get_list;

Cargué todo el script en Azimutt, elegí Oracle de la lista de RDBMS disponibles y, al final, obtuve una representación visual clara de mi esquema con la que podía interactuar para identificar exactamente dónde se necesitaba más comprensión.

Entonces, lo primero que hice fue investigar ese molesto informe Obtener factura para lo que sea. Con un poco de juego esto es lo que obtuve:

Finalmente pude entender claramente lo que estaba pasando. Compartí el diagrama con mis colegas para que ellos también lo entendieran.

Dicho esto, acababa de arañar la superficie de lo que Azimutt puede hacer, pero parece que está cumpliendo sus promesas. Puedes:

busque en todas partes muestre, oculte y organice tablas muestre, oculte y ordene columnas busque tablas relevantes, siga relaciones construya posibles rutas entre dos tablas a las que desea unirse enumere relaciones analice su esquema para brindarle información guarde su esquema comparta su esquema

En cuanto a la privacidad, todo es local a pesar de usar un navegador, ya que todo se almacena en su almacenamiento local. Solo carga su archivo en su navegador, que luego se analiza, ve y almacena en su navegador. El servidor no está involucrado en absoluto, ni siquiera una solicitud http.

También es completamente de código abierto con su código fuente alojado en GitHub, por lo que si es un desarrollador puede instalarlo localmente en su máquina o alojarlo usted mismo.

Y, por supuesto, lo que salva el día es la interfaz de usuario intuitiva; agradable a la vista y fácil de usar.

¡Estoy vendido, toma mi dinero! ¿Qué, es gratis? ¡No hay manera!

También puede gustarte...