2011/6/29 Flavio Henrique Araque Gurgel <fha...@gmail.com>:
>
> Meus dois centavos nesta discussão vão na direção contrária.

Vou discordar, correndo o risco de parecer ridículo — afinal, tu representas
*o* caso de PostgreSQL do milênio…


> - A idéia é péssima no sentido contrário: a aplicação tem centenas de
> milhares de usuários e funciona em escala nacional. Como toda a regra
> de negócio está no banco, o consumo de CPU é altíssimo, batendo em
> 100% em máquinas bastante parrudas.

Claro que não tenho como questionar, não tenho informações suficientes nem, no
momento, quero ter… mas essa é uma questão interessante.  Regras de negócio
causando uso total de processadores no servidor de bases de dados, na minha
experiência e na lógica que chego a alcançar, costuma indicar problemas de
codificação, principalmente por uso de modelos de programação descasados com o
modelo relacional, como o navigacional e o POG: respectivamente, tipicamente
representados pelos clipeiros e pelo Hibernate, claro que nem de longe
exclusiva, embora talvez majoritariamente.

        A outra grande causa de uso exagerado de recursos computacionais pelas
regras de negócio costuma ser má modelagem, de novo por falta de entendimento
do modelo relacional.  Por exemplo, a famigerada ‘desnormalização’, o uso
indiscriminado de chaves artificiais, a falta de uso dos tipos definidos por
usuário (tipos ‘abstratos’ de dados) &c.

        Claro que, muitas vezes, o pobre do DBA, que deveria receber adicional
de insalubridade por ser, na prática, gari de curva de rio, não tem como
garantir nem o modelo, nem a qualidade da programação.  Mas creio que vale a
pena mencionar para que não fique parecendo que a ‘culpa’ é da garantia das
regras de negócio no SGBD.  Isso deveria ser um requisito conceitual absoluto,
embora nem sempre o SQL facilite e quase nunca a organização tenha competência
(ou as famosas ‘condições objetivas’) para alcançar.


> Quando é necessário aumentar a escala de atendimento, é necessário colocar
> máquina mais poderosa.

Hm, quando armazenamento de massa em memória /flash/ se tornar mais lugar
comum, conquistar nossa confiança, for bem aproveitada por nossos sistemas de
arquivos… quem sabe consigamos implementar os conceitos do saudoso (em parte)
/mainframe/, como as hierarquias de memórias e armazenamento.


> Isso depois de muito tuning e uso de PostgreSQL 9 onde a parte de BI e
> relatórios com consultas mais complicadas são feitas em servidor
> hot-standby.

Até aí, seguindo as regras, né?  Morreu o Neves, quem faz diferente é quem tem
de se explicar…


> Para escalar horizontalmente esse ambiente, só há uma forma: modificar
> toda a estrutura do banco quando estiver disponível totalmente a
> implementação de SQL-MED, pra poder fazer com mais facilidade o uso de
> dados remotos e separar fisicamente tabelas por regiões ou estados.

Experiência com Oracle em telecom (operadoras de telefonia fixa & celular):
mesmo uma implementação meia‐boca e mal compreendida, como é a da Oracle, pode
trazer grandes ganhos.  No caso, tínhamos as tabelas ditas ‘de referência’ em
pequenos servidores localizados juntos a setores administrativos, de
atendimento ao usuário &c, que salvavam a pele dos programas aplicativos
cliente‐servidor.  Está certo que eu, particularmente, não ‘acredito’ nem em
cliente‐servidor nem em nenhum papai‐noel da vida, mas às vezes tem‐se de
fazer malabarismo para impedir que o estrume alcance o proverbial ventilador…


> Se a regra de negócio estivesse na camada de aplicação, seria possível
> dividir dados usando alguma técnica de sharding com mais facilidade e
> menos alterações em código.

Sim, com a tecnologia atual, sim.  Pelo pouco que entendo do SQL‐MED, nem ele
chega a implementar de verdade um SGBDDistribuídas.  Idealmente, poderíamos
programar, digamos, em SQL/PSM ou PL/Scheme ou o que bem entendêssemos, e
deslocar o código transparentemente entre servidores.  Mesmo assim, a minha
expectativa seria de que, freqüentemente, descobriríamos que as regras de
negócio teriam melhor desempenho junto da base, por evitarem latências
decorrentes de mudanças de contexto, transferências de dados pela rede &c.


> Minha dica para novos sistemas é sempre assim:
> - regra de negócio sempre numa camada fora do banco de dados;
> - llinguagens procedurais devem e podem ser utilizadas, mas de forma
> restrita para as funcionalidades de banco de dados (ex.:
> particionamento, regras para suprir restrições, validação de dados não
> possíveis por restrições, etc);

Pois é, mas se considerarmos que todas as regras de negócios devem ser
implementadas como restrições, de preferência declarativas, fica contraditório
ter isso fora da base, não?  Ou minha lógica falhou nalgum ponto que não
alcancei?

        Sim, claro, o SQL não é relacional, isso impõe restrições e tudo o
mais… mas o PostgreSQL, particularmente, é suficientemente próximo do ISO
SQL:2008, e até do modelo relacional, para o desenvolvimento de um novo
sistema aplicativo por uma equipe competente com requisitos claros, completos
e estáveis ser viável sem grandes gambiarras… claro, se existissem equipes
competentes com requisitos claros, completos e estáveis no mundo real.


> - camada de apresentação separada da camada de aplicação.

Como manda o mítico manual que está no céu, no divino Braço Direito do
Criador… sem ironia.


> Assim suprem-se as técnicas MVC modernas e ganha-se em portabilidade
> (fica mais fácil migrar de SGBD ou misturar SGBDs)

Na minha opinião — e constato, aliviado, que na opinião de pelo menos dois ou
três profiças muito mais inteligentes, experientes e bem informados que eu —
portabilidade total, dado que o SQL não é relacional e é muito mal
implementado no mundo extraelefantíaco, é um mito, cuja busca tipicamente
resulta em sistemas que nem são portáveis, nem corretos, nem manteníveis (eita
palavriña orroroza, alguém tem alguma melhor?), nem escaláveis, nem sequer
portáveis… eu ia dar o exemplo do Propvs μiga, mas aí é chutar cão defunto.


> e escalabilidade (usar linguagem procedural para movimentar dados de forma
> independente da aplicação).

Será que é muita ingenuidade minha achar que linguagem procedural costuma ser
antítese de escalabilidade?  SQL é declarativo, em primeiro lugar, em que pese
a conveniência de se ter o SQL/PSM e alternativas para suprir as deficiências
do SQL declarativo… e também acho ‘engraçada’, por assim dizer, essa divisão
entre base, movimentação de dados, e aplicação.  Desempenho, disponibilidade,
escalabilidade, responsividade sempre teriam de ser avaliadas no conjunto…

        Pega que é tua, Rangel.  Destrói aí.


-- 
Skype:leandro.gfc.dutra?chat           Yahoo!: ymsgr:sendIM?lgcdutra
+55 (61) 3546 7191             Google Talk: xmpp:leand...@jabber.org
+55 (11) 9406 7191                 ICQ: AIM:GoIM?screenname=61287803
sip:leand...@iptel.org  MSNIM:chat?contact=lean...@dutra.fastmail.fm
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a