O elefante ilustrado Ferramentas de modelagem literária e documentação automática em PostgreSQL e ouos SGBDs lⅳres Leandro Guimarães Faria Corcete D X Fórum Internacional de Sistemas Lⅳres () Sumário Ferramentas de modelagem Um problema muito comum em Informática é o de modelagem de dados. Programa que usa base de dados, mas o programador, arquiteto, analista ou seja-lá-qual-for-o-nome nunca planejou; cuja base de dados nem os programadores conhecem direito; que não registra todas as informações necessárias, exatamente porque a base evoluiu ad hoc; ou até que foi bem pensado no início, mas por falta de manutenção da documentação acabou com um modelo de dados que ninguém entende mais. Para falarmos só de sistemas lⅳres, dois programas que têm fama de terem modelos de dados inatáveis são o Bacula e o RT. Muitos ouos programas têm modelos insuficientemente documentados, o que limita em muito sua utilidade, senão para programadores dedicados, ao menos para usuários ocasionais; um exemplo é o vtiger a última vez que procurei, achei apenas um diagrama quase ilegível duma versão obsoleta. Nossa tendência, como informatas, é procurar ferramentas que nos ajudem a resolver problemas. Quais são as alternatⅳas de ferramentas para criação e manutenção de modelos de dados? Cérebro! Lⅳros-texto e documentação Caneta e papel Programas de diagramação
DDL Sério. Use seu cérebro. Pense a respeito, e gaste tempo e esforço nisso. E leia a respeito; não eⅺste substituto para o estudo. Essas são as principais ferramentas, e o PostgreSQL pode se orgulhar a ter uma das melhores documentações disponíveis, a ponto de ser usada por gente que abalha com ouos sistemas inclusⅳe por gente que cria ouos SGBDs! (SGBDs!)! Quanto às ouas ferramentas. Modelagem com diagramas Normalmente quando se pensa modelagem, se pensam diagramas. Que vão gerar código assim: DROP TYPE IF EXISTS " t y p e " CASCADE; CREATE TYPE " t y p e " AS (INPUT = a, OUTPUT = b ) ; DROP DOMAIN IF EXISTS " domain " CASCADE; CREATE DOMAIN " domain " AS t y p e NOT NULL; DROP TABLE IF EXISTS " t a b l e " CASCADE; CREATE TABLE " t a b l e " ( " f i e l d _ " domain
) WITHOUT OIDS TABLESPACE " t a b l e s p a c e " ; ALTER TABLE " t a b l e " ADD CONSTRAINT " t a b l e _ p k " PRIMARY KEY( " f i e l d _ " ) ; DROP TABLE IF EXISTS " t a b l e " CASCADE; CREATE TABLE " t a b l e " ( " f i e l d _ " b o o l e a n ( ), " f i e l d _ " domain ) WITHOUT OIDS ; ALTER TABLE " t a b l e " ADD CONSTRAINT " t a b l e _ p k " PRIMARY KEY( " f i e l d _ " ) ; COMMENT ON TABLE " t a b l e " IS ' I s s o! ' ; COMMENT ON COLUMN " t a b l e ". " f i e l d _ " IS ' A q u i l o. ' ; ALTER TABLE " t a b l e " DROP CONSTRAINT " t a b l e _ f k e y " CASCADE; ALTER TABLE " t a b l e " ADD CONSTRAINT " t a b l e _ f k e y " FOREIGN KEY ( " f i e l d _ " ) REF " t a b l e " ( " f i e l d _ " ) ON UPDATE RESTRICT ON DELETE RESTRICT; O que já não é um código bonito mas o que acontece quando se tem centenas, talvez milhares de tabelas? Ferramentas de diagramação Não escalam São caras São improdutⅳas São limitadas Engessam Mas se sua necessidade é abalhar com pequenos modelos e só em PostgreSQL, o PgDesigner até que é uma boa. Na verdade, o uso de diagramas acaba sendo mais útil em duas principais situações:.. Esboços Diagramas são bem úteis para esboços, quando se quer bastante liberdade. Muna-se de caneta ou lápis, e um bocado de papel-rascunho; e dê asas à imaginação. O mero esforço de diagramar algo num programa já limitaria em muito o abalho de esboçar idéias de modelagem, principalmente quando se faz a modelagem interatⅳamente, com uma (pequena) equipe.
.. Apresentação Diagramas também são bastante úteis para apresentar o modelo de dados, quer em desenvolⅵmento, quer já pronto, a pessoas que não participam da modelagem diretamente: analistas, programadores, gerência, clientes e isso levanta um problema: cada um pode se interessar por uma versão diferente do diagrama; e a manutenção do diagrama pode consumir um bocado de tempo que não é propriamente abalho de modelagem, mas de ajustes gráficos. Que solução podemos apresentar?. Modelagem com SQL Uma boa opção é modelar em ISO! (ISO!) SQL! (SQL!), ou diretamente em PostgreSQL; quer dizer, no dialeto SQL! implementado pelo PostgreSQL. Poderia até ser numa linguagem mais elegante, como o D do Dataphor, que está há tempos para ganhar logo mais a capacidade de abalhar com PostgreSQL(??). A grande vantagem é que o código-fonte expressa exatamente o que o modelo contém, de maneira prática de ler e, principalmente, manipular. Por exemplo, as definições de tipos e domínios podem ser reaproveitadas na criação de macros para ouas linguagens de programação, isolando o programador, em certa medida, de mudanças nos tipos de dados da base... Gerando diagramas e outros documentos Tendo o código-fonte da base de dados, o abalho de diagramação e documentação tornase exemamente prático e flexível porque pode ser automatizado. Em PostgreSQL, temos o luxo de ês ótimas ferramentas para isso:. Ferramentas de diagramação automática AutoDoc Gráficos DocBook HTML SQL::Fairy Gráficos L A TEX Schema Spy
Gráficos L A TEX Não apenas paramos de nos preocupar com a diagramação, como ela pode ser automatizada: por exemplo, um programeta (script) que gere a última versão do diagrama conforme o DDL! (DDL!) armazenado no sistema de conole de código-fonte; e tornase flexível, por exemplo sendo manipulável para gerar diagramas de partes específicas do modelo, soendo ansformações etc! (etc!)... Invertendo o processo: programação literária Vejam que até agora seguimos um processo relatⅳamente desconexo:. Requisitos (OpenOffice.org &c). Modelo. Diagramas, base. Documentos E se fizéssemos isso de maneira mais integrada? Essa é a proposta da programação literária, do Donald K, criador do TEX. É muito mais prazeroso criar uma base contando a história de suas decisões sobre a modelagem. O processo fica assim:. Requisitos (OpenOffice.org &c). Copiados para um documento L A TEX. Documento desenvolⅵdo para incluir o SQL. Diagramas, base Por exemplo, uma vez recebi a seguinte amostra de código MySQL! (MySQL!) para corrigir e implantar num SGBD! (SGBD!) de verdade: Cógido MySQL a consertar CREATE TABLE IF NOT EXISTS ` sko_admin ` ( ` id ` i n t ( ) NOT NULL a u t o _ i n c r e m e n t, ` adminusername ` v a r c h a r ( ) NOT NULL, ` adminpassword ` v a r c h a r ( ) NOT NULL, ` adminemail ` v a r c h a r ( ) NOT NULL,
` a d m i n s t a t u s ` i n t ( ) NOT NULL d e f a u l t ' ', PRIMARY KEY ( ` id ` ) ) ENGINE=MyISAM DEFAULT CHARSET= u t f AUTO_INCREMENT= ; CREATE TABLE IF NOT EXISTS ` s k o _ b l o g c a t e g o r y ` ( ` id ` i n t ( ) NOT NULL a u t o _ i n c r e m e n t, ` b l o g c a t e g o r y n a m e ` v a r c h a r ( ) NOT NULL, ` b l o g c a t e g o r y s t a t u s ` i n t ( ) NOT NULL d e f a u l t ' ', PRIMARY KEY ( ` id ` ) ) ENGINE=MyISAM DEFAULT CHARSET= u t f AUTO_INCREMENT= ; Para explicar minhas alterações, criei o seguinte código-fonte noweb: Programação literária \ d o c u m e n t c l a s s [ p t ] { a r t i c l e } \ u s e p a c k a g e { acronym, noweb } \ n o w e b o p t i o n s { s m a l l c o d e, l o n g c h u n k s } \ b e g i n { document } \ p a g e s t y l e { noweb } \ t i t l e { SkooLabo } \ a u t h o r { Leandro G u i m a r ã e s F a r i a C o r c e t e Dutra } \ m a k e t i t l e \ t a b l e o f c o n t e n t s Programação literária \ n w f i l e n a m e { i l u s. nw } \ n w b e g i n d o c s { } \ s e c t i o n { I n t r o d u c t i o n } P r i m e i r o, o que mudou e p o r q u ê. MySQL tem uma n o m e n c l a t u r a e x c ê n t r i c a. S u a s c h a v e s s ã o í n d i c e s ; a s b a s e s de dados, e squemas. U s a r e i a n o m e n c l a t u r a r e l a c i o n a l p a r a e s c l a r e c e r. \ s e c t i o n { S u p p o r t i n g f u n c t i o n s } Aqui l i s t a m o s a s f u n ç õ e s a u x i l i a r e s, p r i n c i p a l m e n t e p a r a r e s t r i ç õ e s de i n t e g r i d a d e. O p r i m e i r o exemplo v a l i d a e n d e r e ç o s de c o r r e i o
\ nwenddocs { } \ nwbegincode { } \ moddef { v a l f u n c } \ endmoddef \ n w s t a r t d e f l i n e m a r k u p \ n CREATE FUNCTION v a l i d _ e m a i l _ a d d r e s s ( t e x t ) RETURNS BOOLEAN IMMUTABLE LANGUAGE p l p e r l u AS u s e Email : : V a l i d ; my e m a i l = s h i f t ; Email : : V a l i d > a d d r e s s ( e m a i l ) or d i e " I n v a l i d e m a i l a d d r e s s : e m a i l \ \ n " ; r e t u r n ' t r u e ' ; ; \ \ l s t s e t \ { l a n g u a g e =[ LaTeX ]TeX \ } \ nwendcode { } \ n w b e g i n d o c s { } \ n w d o c s p a r Aqui d e f i n i m o s DOMAINs. São i m p o r t a n t e s p a r a manter c o n s i s t ê n c i a. \ nwenddocs { } \ nwbegincode { } \ moddef { domains } \ endmoddef \ n w s t a r t d e f l i n e m a r k u p \ n w CREATE DOMAIN username AS VARCHAR ( ) CONSTRAINT nn_un NOT NULL ; CREATE DOMAIN p a s s w o r d AS VARCHAR ( ) CONSTRAINT nn_pw ; NOT NULL \ \ l s t s e t \ { l a n g u a g e =[ LaTeX ]TeX \ } \ nwendcode { } \ n w b e g i n d o c s { } \ n w d o c s p a r Nosso p r i m e i r o exemplo de t a b e l a d e f i n i d a em d o m i n i o s de u s u á r i o. \ nwenddocs { } \ nwbegincode { } \ moddef { admin } \ endmoddef \ n w s t a r t d e f l i n e m a r k u p \ n w e n
( CREATE TABLE IF NOT EXISTS admin username username CONSTRAINT p k_ a d PRIMARY KEY, p a s s w o r d p a s s w o r d, e m a i l _ a d d r e s s e m a i l _ a d d r e s s, a d m i n _ s t a t u s a d m i n _ s t a t u s > ) ; Ao p r o c e s s á lo, obtenho o s e g u i n t e \ \ a c \ {DDL\ } : CREATE FUNCTION v a l i d _ e m a i l _ a d d r e s s ( t e x t ) RETURNS BOOLEAN IMMUTABLE LANGUAGE p l p e r l u AS u s e Email : : V a l i d ; my e m a i l = s h i f t ; Email : : V a l i d > a d d r e s s ( e m a i l ) or d i e " I n v a l i d e m a i l a d d r e s s : e m a i l \ \ n " ; r e t u r n ' t r u e ' ; ; CREATE DOMAIN username AS VARCHAR ( ) CONSTRAINT nn_un ; NOT NULL ( CREATE TABLE IF NOT EXISTS admin username username
CONSTRAINT p k_ a d PRIMARY KEY, p a s s w o r d p a s s w o r d, e m a i l _ a d d r e s s e m a i l _ a d d r e s s, a d m i n _ s t a t u s a d m i n _ s t a t u s > ) ; E o s e g u i n t e c ó d i g o f o n t e \ \ LaTeX : \ \ l s t s e t \ { l a n g u a g e =[ LaTeX ]TeX \ } \ \ d o c u m e n t c l a s s [ p t ] \ { a r t i c l e \}% === > t h i s f i l e was g e n e r a t e d a u t o m a t i c a l l y b \ \ u s e p a c k a g e \ { acronym, noweb \ } \ \ n o w e b o p t i o n s \ { s m a l l c o d e, l o n g c h u n k s \ } \ \ b e g i n \ { document \ } \ \ p a g e s t y l e \ { noweb \ } \ \ t i t l e \ { SkooLabo \ } \ \ a u t h o r \ { Leandro G u i m a r ã e s F a r i a C o r c e t e Dutra \ } \ \ m a k e t i t l e \ \ t a b l e o f c o n t e n t s \ \ n w f i l e n a m e \ { db. nw \ } \ \ n w b e g i n d o c s \ { \ } \ \ s e c t i o n \ { I n t r o d u c t i o n \ } \ \ s e c t i o n \ { S u p p o r t i n g f u n c t i o n s \ } Here we l i s t s u p p o r t i n g f u n c t i o n s, u s e d m a i n l y f o r d a t a i n t e g r i t y c o n s t r a i n t s \ \ l s t s e t \ { l a n g u a g e =[ LaTeX ]TeX \ } Our f i r s t e x a m p l e i s meant t o v a l i d a t e e m a i l a d d r e s s e s. I n s t e a d o f c o d i n g a C e m a i l a d d r e s s v a l i d a t i o n a s an SQL TYPE, we j u s t make u s e o f a canned P e r l f u n g o t t e n from CPAN or y o u r t h e r e p o s i t o r y from y o u r d i s t r i b u t i o n. \ \ nwenddocs \ { \ } \ \ n wbegincode \ { \ } \ \ moddef \ { v a l f u n c \ } \ \ endmoddef \ \ n w s t a r t d e f l i CREATE FUNCTION v a l i d _ e m a i l _ a d d r e s s ( t e x t ) RETURNS BOOLEAN
IMMUTABLE LANGUAGE p l p e r l u AS u s e Email : : V a l i d ; my e m a i l = s h i f t ; Email : : V a l i d > a d d r e s s ( e m a i l ) or d i e " I n v a l i d e m a i l a d d r e s s : e m a i l \ \ \ \ n " ; r e t u r n ' t r u e ' ; ; Que v a i g e r a r um b e l o documento : \ \ f r a m e t i t l e < p r e s e n t a t i o n > \ { R e s u l t a d o f i n a l \ } Here we l i s t s u p p o r t i n g f u n c t i o n s, u s e d m a i n l y f o r d a t a i n t e g r i t y c o n s t r a i n t s Our f i r s t e x a m p l e i s meant t o v a l i d a t e e m a i l a d d r e s s e s. I n s t e a d o f c o d i n g a C e m a i l a d d r e s s v a l i d a t i o n a s an SQL TYPE, we j u s t make u s e o f a canned P e r l f u n g o t t e n from CPAN or y o u r t h e r e p o s i t o r y from y o u r d i s t r i b u t i o n. CREATE FUNCTION v a l i d _ e m a i l _ a d d r e s s ( t e x t ) RETURNS BOOLEAN IMMUTABLE LANGUAGE p l p e r l u AS u s e Email : : V a l i d ; my e m a i l = s h i f t ; Email : : V a l i d > a d d r e s s ( e m a i l ) or d i e " I n v a l i d e m a i l a d d r e s s : e m a i l \ \ \ \ n " ; r e t u r n ' t r u e ' ; ; Uma p i t a d a de AutoDoc ou \ \ a c \ { SQL \ } : : F a i r y, e \ \ f o r e i g n l a n g u a g e \ { f r e n c h \ } \ { l à um b e l o documento quanto d i a g r a m a s e a n o s s a a l m e j a d a b a s e de d a d o s!
\ \ s u b s e c t i o n \ { C o n t r o l e do c i c l o de v i d a da b a s e \ } Agora f i c o u ó b v i o onde q u e r í a m o s c h e g a r : e x p l o r a n d o a s p o t e n c i a l i d a d e s de s e PostgreSQL e f e r r a m e n t a s a u x i l i a r e s como p r o g r a m a ç ã o l i t e r á r i a \ \ LaTeX, AutoD o u t r a s, temos c o n d i ç õ e s de t o r n a r o t r a b a l h o de A d m i n i s t r a ç ã o de Dados p a r t e p r o c e s s o de d e s e n v o l v i m e n t o, i n c l u s i v e a u t o m a t i z a n d o muito do t r a b a l h o manual \ \ s e c t i o n \ { A b r e v i a ç õ e s \ } \ \ b e g i n \ { acronym \ } \ \ a c r o \ {ABD\ } \ { A d m i n i s t r a d o r de B a s e s de Dados \ } \ \ a c r o \ { ABDs \ } \ { A d m i n i s t r a d o r e s de B a s e s de Dados \ } \ \ a c r o \ {AD\ } \ { A d m i n i s t r a d o r de Dados \ } \ \ a c r o \ {DBA \ } \ { \ \ f o r e i g n l a n g u a g e \ { b r i t i s h \ } \ { D a t a b a s e A d m i n i s t r a t o r \ } \ \ a c r o b a s e s de d a d o s ) \ } \ } \ \ a c r o \ {DDL\ } \ { \ \ f o r e i g n l a n g u a g e \ { b r i t i s h \ } \ { Data D e f i n i t i o n Language \ } \ \ a c d e f i n i ç ã o de d a d o s ) \ } \ } \ \ a c r o \ {DER\ } \ { Diagrama de E n t i d a d e s e R e l a c i o n a m e n t o s \ } \ \ a c r o \ { DERs \ } \ { D i a g r a m a s de E n t i d a d e s e R e l a c i o n a m e n t o s \ } \ \ a c r o \ { e t c \ } [ \ \ & c ] \ { e t œ c t e r a \ } \ \ a c r o \ { IBM \ } \ { \ \ f o r e i g n l a n g u a g e \ { b r i t i s h \ } \ { I n t e r n a t i o n a l B u s i n e s s Machine \ \ a c r o \ { ISO \ } \ { \ \ f o r e i g n l a n g u a g e \ { b r i t i s h \ } \ { I n t e r n a t i o n a l S t a n d a r d s O r g a n i I n t e r n a c i o n a l de P a d r õ e s ) \ } \ } \ \ a c r o \ {MR\ } \ { Modelo R e l a c i o n a l \ } \ \ a c r o \ {MS \ } \ { \ \ f o r e i g n l a n g u a g e \ { b r i t i s h \ } \ { M i c r o S o f t \ } \ \ a c r o e x t r a \ { ( p r o g r a \ \ a c r o \ {MVS \ } \ { \ \ f o r e i g n l a n g u a g e \ { b r i t i s h \ } \ { M u l t i p l e V i r t u a l S t o r a g e \ } \ } \ \ a c r o \ {MVT\ } \ { \ \ f o r e i g n l a n g u a g e \ { b r i t i s h \ } \ { Multiprogramming w i t h a V a r i a b \ \ a c r o \ {MySQL \ } \ { My \ \ t e x t s c \ { Widenius \ } SQL \ } \ \ a c r o \ {OO\ } \ { O r i e n t a ç ã o a O b j e t o s \ } \ \ a c r o \ { OS \ } \ { \ \ f o r e i g n l a n g u a g e \ { b r i t i s h \ } \ { O p e r a t i n g System \ } \ \ a c r o e x t r a \ { \ \ a c r o \ {PSM \ } \ { \ \ f o r e i g n l a n g u a g e \ { b r i t i s h \ } \ { P e r s i s t e n t S t o r e d Modules \ } \ \ a programa a r m a z e n a d o s p e r s i s t e n t e m e n t e ) \ } \ } \ \ a c r o \ { SAN \ } \ { S t o r a g e Area Network \ } \ \ a c r o \ { SANs \ } \ { S t o r a g e Area Networks \ } \ \ a c r o \ {SGBD \ } \ { S i s t e m a G e s t o r de B a s e s de Dados \ } \ \ a c r o \ { SGBDs \ } \ { S i s t e m a s G e s t o r e s de B a s e s de Dados \ } \ \ a c r o \ { SQL \ } \ { \ \ f o r e i g n l a n g u a g e \ { b r i t i s h \ } \ { S t r u c t u r e d Query Language \ } \ \ a e s t r u t u r a d a de p e s q u i s a s ) \ } \ } \ \ a c r o \ { z \ } \ { \ \ f o r e i g n l a n g u a g e \ { b r i t i s h \ } \ { z S e r i e s \ } \ } \ \ end \ { acronym \ } \ \ a d d c o n t e n t s l i n e \ { t o c \ } \ { s e c t i o n \ } \ { B i b l i o g r a f i a \ } \ \ b i b l i o g r a p h y \ { i l u s \ } \ \ b i b l i o g r a p h y s t y l e \ { abnt num \ }