{"id":3022,"date":"2014-11-28T08:27:18","date_gmt":"2014-11-28T10:27:18","guid":{"rendered":"http:\/\/blog.dialhost.com.br\/?p=3022"},"modified":"2014-11-28T08:27:18","modified_gmt":"2014-11-28T10:27:18","slug":"nao-faca-regras-de-negocio-dentro-sgdb","status":"publish","type":"post","link":"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/","title":{"rendered":"N\u00e3o fa\u00e7a regras de neg\u00f3cio dentro do SGDB"},"content":{"rendered":"<figure id=\"attachment_2897\" aria-describedby=\"caption-attachment-2897\" style=\"width: 700px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.dialhost.com.br\/wp-content\/uploads\/2014\/10\/banco-de-dados.jpg\"><img loading=\"lazy\" class=\"size-full wp-image-2897\" src=\"http:\/\/blog.dialhost.com.br\/wp-content\/uploads\/2014\/10\/banco-de-dados.jpg\" alt=\"banco de dados\" width=\"700\" height=\"260\" \/><\/a><figcaption id=\"caption-attachment-2897\" class=\"wp-caption-text\">Imagem ilustrativa<\/figcaption><\/figure>\n<p>J\u00e1 se passaram muitos anos desde a d\u00e9cada de 90 e ainda assim eu continuo ouvindo e vendo muitas corpora\u00e7\u00f5es colocando regra de neg\u00f3cio das solu\u00e7\u00f5es dentro de um banco de dados. Hoje o cen\u00e1rio de solu\u00e7\u00f5es corporativas \u00e9 outro completamente mais complexo e a arquitetura em duas camadas n\u00e3o oferece caracter\u00edsticas que sustente sua evolu\u00e7\u00e3o. Resumidamente, solu\u00e7\u00f5es constru\u00eddas em duas camadas n\u00e3o cumprem requisitos como escalabilidade, extensibilidade, manutenibilidade, seguran\u00e7a, perfomance e disponibilidade. Dessa forma, hoje usamos arquitetura n-camadas que \u00e9 a \u00fanica que, se bem projetada, pode cumprir todos os requisitos n\u00e3o-funcionais caracter\u00edsticos das solu\u00e7\u00f5es atuais. Segue um resumo b\u00e1sico dos velhos e j\u00e1 batidos motivos documentados que justificam o n\u00e3o uso de regras dentro de um banco de dados:<\/p>\n<p><strong>1. Acomplamento<\/strong><\/p>\n<p>Regra dentro do banco de dados viola o princ\u00edpio<a href=\"http:\/\/en.wikipedia.org\/wiki\/Separation_of_concerns\" target=\"_blank\" rel=\"noopener noreferrer\"> SOC<\/a>, que define que cada peda\u00e7o de um sistema precisa estar localizado em um lugar \u00fanico e exclusivo promovendo isolamento, manuten\u00e7\u00e3o, reutiliza\u00e7\u00e3o e futura substitui\u00e7\u00e3o, sem impacto nas outras partes.<\/p>\n<p><strong>2. Falta de portabilidade<\/strong><\/p>\n<p>Regras escritas dentro do banco n\u00e3o oferecem portabilidade entre os diferentes produtos concorrentes da mesma filosofia de banco de dados adotado. Na d\u00e9cada de 90 j\u00e1 era um transtorno e s\u00f3 t\u00ednhamos os famosos <a href=\"http:\/\/pt.wikipedia.org\/wiki\/Sistema_de_gerenciamento_de_banco_de_dados\" target=\"_blank\" rel=\"noopener noreferrer\">SGDB<\/a>. Hoje, ent\u00e3o, a coisa piorou com o surgimento do <a href=\"http:\/\/pt.wikipedia.org\/wiki\/NoSQL\" target=\"_blank\" rel=\"noopener noreferrer\">NoSQL<\/a> e suas v\u00e1rias op\u00e7\u00f5es estruturais.<\/p>\n<p><strong>3. P\u00e9ssima manuten\u00e7\u00e3o e c\u00f3digo inflex\u00edvel<\/strong><\/p>\n<p>Regras no banco de dados s\u00e3o, na maioria das vezes, escritas usando <a href=\"http:\/\/en.wikipedia.org\/wiki\/Stored_procedure\" target=\"_blank\" rel=\"noopener noreferrer\">store procedures\u00a0<\/a> (filosofia procedural da d\u00e9cada de 60) que s\u00e3o desprovidos de recursos e as diretrizes da <a href=\"http:\/\/en.wikipedia.org\/wiki\/Object-oriented_programming\" target=\"_blank\" rel=\"noopener noreferrer\">OOP<\/a> como encapsulamento, agrega\u00e7\u00e3o, composi\u00e7\u00e3o, associa\u00e7\u00e3o, heran\u00e7a e polimorfismo e da mesma forma n\u00e3o conseguem usufruir de nenhum tipo de padr\u00f5es (patterns) arquiteturais, projetos e programa\u00e7\u00e3o.<\/p>\n<p><strong>4. Know-how especializado<\/strong><\/p>\n<p>Regras no banco de dados precisam ser manutenidas por profissionais que detenham conhecimento especializado para aquele produto espec\u00edfico e filosofia de banco de dados adotado, sendo dif\u00edcil eqou caro de encontrar mercado ou de form\u00e1-lo internamente.<\/p>\n<p><strong>5. Problemas de performance<\/strong><\/p>\n<p>Solu\u00e7\u00f5es de grande porte, dotadas de um grande e crescente n\u00famero de acessos simult\u00e2neos e com a execu\u00e7\u00e3o de regras pesadas v\u00e3o degradando gradativamente a performance da solu\u00e7\u00e3o, podendo at\u00e9 (que \u00e9 o acontece na maioria dos casos) derrubar o servi\u00e7o, uma vez que os banco de dados s\u00e3o desprovidos de devidos gerenciamentos de recursos encontrados normalmente em <a href=\"http:\/\/en.wikipedia.org\/wiki\/Middleware\" target=\"_blank\" rel=\"noopener noreferrer\">MIDDLEWARE<\/a> relacionados com t\u00e9cnicas de otimiza\u00e7\u00f5es, tunning, comunica\u00e7\u00e3o ass\u00edncronas, mensageira (<a href=\"http:\/\/en.wikipedia.org\/wiki\/Message-oriented_middleware\" target=\"_blank\" rel=\"noopener noreferrer\">MOM<\/a>), escalabilidade vertical e horizontal apropriadas aplicadas especificamente na execu\u00e7\u00e3o das regras de neg\u00f3cios.<\/p>\n<p><strong>6. Aus\u00eancia de recursos<\/strong><\/p>\n<p>Regras de neg\u00f3cio normalmente englobam o uso de recursos como l\u00f3gica bin\u00e1ria, manipula\u00e7\u00e3o de arquivos PDF, DOC, XLS, XML, JSON. Comunica\u00e7\u00e3o com sistemas externos como LDAP, SMTP, FTP, Mensageira, SOAP, REST etc. Os SGDB normalmente n\u00e3o possuem API\u2019s dispon\u00edveis para estes fins e muitos outros recursos, salvo em casos raros que alguns provedores de SGDB fornece alguma coisa bem limitada e propriet\u00e1ria para tratar um ou outro. A coisa piora por que normalmente n\u00e3o existe abertura para se acrescentar uma API de terceiros para dentro do banco.<\/p>\n<p><strong>Conclus\u00e3o<\/strong><\/p>\n<p><a href=\"http:\/\/martinfowler.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Martin Folwer<\/a>, no livro <a href=\"http:\/\/www.amazon.com\/Patterns-Enterprise-Application-Architecture-Martin\/dp\/0321127420\" target=\"_blank\" rel=\"noopener noreferrer\">Patterns of Enterprise Application Architecture<\/a> \u2013 capitulo 8, escreveu:<\/p>\n<p>\u201cPor todas estas quest\u00f5es, muitas pessoas evitam implementar regras de neg\u00f3cio dentro de um banco de dados. Eu tento me alinhar com esta vis\u00e3o, a menos que haja um grande ganho de desempenho a ser obtido \u2013 o que, para ser sincero, frequentemente ocorre. Nesse caso, pego um m\u00e9todo de neg\u00f3cio da camada de dom\u00ednio e alegremente\u00a0 o transformo em um procedure dentro de um banco de dados. Fa\u00e7o isso apenas em \u00e1reas com claros problemas de desempenho, tratando-o como um abordagem de otimiza\u00e7\u00e3o e n\u00e3o como um principio arquitetural\u201d.<\/p>\n<p>Joshua Bloch, no livro <a href=\"https:\/\/fernandofranzini.wordpress.com\/2012\/08\/07\/java-efetivo-aprenda-realmente-a-programar-java\/\" target=\"_blank\" rel=\"noopener noreferrer\">Java Effective<\/a>, escreveu no item 55 (que eu resumi):<\/p>\n<p>\u201cA hist\u00f3ria das d\u00e9cadas passadas nos mostram que otimiza\u00e7\u00e3o prematura na verdade \u00e9 mais propenso a causar danos do que benef\u00edcios. O caminho da otimiza\u00e7\u00e3o precoce pode lev\u00e1-lo a uma solu\u00e7\u00e3o que ainda n\u00e3o seja r\u00e1pida, arquiteturalmente ruim e, pior de tudo, inflex\u00edvel e de dif\u00edcil evolu\u00e7\u00e3o. Portanto, n\u00e3o tente criar programas r\u00e1pidos! Na verdade, foque em criar bons programas, usando todos os conceitos, princ\u00edpios e abordagem necess\u00e1rios. Se um programa bem arquiteturado n\u00e3o for r\u00e1pido suficiente, a boa arquitetura j\u00e1 estabelecida permitir\u00e1 que ele seja facilmente otimizado. N\u00e3o pense em problemas de desempenho enquanto estiver projetando uma solu\u00e7\u00e3o. Quando terminar a codifica\u00e7\u00e3o, avalie seu desempenho. Se ele for suficientemente r\u00e1pido, tudo estar\u00e1 resolvido. Caso contr\u00e1rio, localize a fonte de gargalo usando uma ferramenta de profile e trabalhe nas partes relevantes. Repita esse processo conforme necess\u00e1rio, avaliando o desempenho ap\u00f3s cada altera\u00e7\u00e3o at\u00e9 apresentar um tempo satisfat\u00f3rio\u201d.<\/p>\n<p>Acredito que todos estes fatos j\u00e1 fornecem base suficiente para que voc\u00ea tenha condi\u00e7\u00f5es de fazer a sua tomada de decis\u00e3o.<\/p>\n<p>At\u00e9 a pr\u00f3xima!<\/p>\n<p>&#8212;&#8211;<\/p>\n<p>Artigo de Fernando Franzini, publicado no <a href=\"http:\/\/imasters.com.br\/banco-de-dados\/nao-faca-regras-de-negocio-dentro-sgdb\/\">iMasters<\/a>.\t\t\t\t<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\t\t\t\tHoje usamos arquitetura n-camadas que \u00e9 a \u00fanica que, se bem projetada, pode cumprir todos os requisitos n\u00e3o-funcionais caracter\u00edsticos das solu\u00e7\u00f5es atuais.\t\t\t\t<\/p>\n","protected":false},"author":1,"featured_media":2898,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[14,3,20,12],"tags":[40,99,158],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v15.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>N\u00e3o fa\u00e7a regras de neg\u00f3cio dentro do SGDB - Blog DialHost<\/title>\n<meta name=\"description\" content=\"Hoje usamos arquitetura n-camadas que \u00e9 a \u00fanica que, se bem projetada, pode cumprir todos os requisitos n\u00e3o-funcionais caracter\u00edsticos das solu\u00e7\u00f5es atuais.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"N\u00e3o fa\u00e7a regras de neg\u00f3cio dentro do SGDB - Blog DialHost\" \/>\n<meta property=\"og:description\" content=\"Hoje usamos arquitetura n-camadas que \u00e9 a \u00fanica que, se bem projetada, pode cumprir todos os requisitos n\u00e3o-funcionais caracter\u00edsticos das solu\u00e7\u00f5es atuais.\" \/>\n<meta property=\"og:url\" content=\"\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog DialHost\" \/>\n<meta property=\"article:publisher\" content=\"http:\/\/www.facebook.com\/DialHost\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/DialHost\" \/>\n<meta property=\"article:published_time\" content=\"2014-11-28T10:27:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dialhost.com.br\/blog\/wp-content\/uploads\/2019\/04\/og-image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@dialhost\" \/>\n<meta name=\"twitter:site\" content=\"@dialhost\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#organization\",\"name\":\"DialHost Internet\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/\",\"sameAs\":[\"http:\/\/www.facebook.com\/DialHost\",\"https:\/\/www.instagram.com\/dialhost_oficial\/\",\"https:\/\/www.linkedin.com\/company\/dialhost-internet\",\"https:\/\/www.youtube.com\/channel\/UCAiqiX8IiqTSfA8wQhpzgXQ\",\"https:\/\/twitter.com\/dialhost\"],\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#logo\",\"inLanguage\":\"pt-BR\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/wp-content\/uploads\/2019\/03\/marca-dialhost.png\",\"width\":81,\"height\":81,\"caption\":\"DialHost Internet\"},\"image\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#logo\"}},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#website\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/\",\"name\":\"Blog DialHost\",\"description\":\"Os melhores conte\\u00fados sobre Desenvolvimento Web, Marketing e Neg\\u00f3cios\",\"publisher\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/www.dialhost.com.br\/blog\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/#webpage\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/\",\"name\":\"N\\u00e3o fa\\u00e7a regras de neg\\u00f3cio dentro do SGDB - Blog DialHost\",\"isPartOf\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/#primaryimage\"},\"datePublished\":\"2014-11-28T10:27:18+00:00\",\"dateModified\":\"2014-11-28T10:27:18+00:00\",\"description\":\"Hoje usamos arquitetura n-camadas que \\u00e9 a \\u00fanica que, se bem projetada, pode cumprir todos os requisitos n\\u00e3o-funcionais caracter\\u00edsticos das solu\\u00e7\\u00f5es atuais.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"\/blog\/\",\"url\":\"\/blog\/\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/\",\"url\":\"\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/\",\"name\":\"N\\u00e3o fa\\u00e7a regras de neg\\u00f3cio dentro do SGDB\"}}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/#webpage\"},\"author\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#\/schema\/person\/a0b10cbe35449dea173a06d4664f9fcc\"},\"headline\":\"N\\u00e3o fa\\u00e7a regras de neg\\u00f3cio dentro do SGDB\",\"datePublished\":\"2014-11-28T10:27:18+00:00\",\"dateModified\":\"2014-11-28T10:27:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/#webpage\"},\"publisher\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/nao-faca-regras-de-negocio-dentro-sgdb\/#primaryimage\"},\"keywords\":\"banco de dados,feed de parceiros,noticias\",\"articleSection\":\"Banco de Dados,Dicas e Not\\u00edcias,Infraestrutura e Seguran\\u00e7a,Tecnologias\",\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#\/schema\/person\/a0b10cbe35449dea173a06d4664f9fcc\",\"name\":\"DialHost Internet\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#personlogo\",\"inLanguage\":\"pt-BR\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/05feec2f99aef1c42b09aeaa637ee66f?s=96&r=g\",\"caption\":\"DialHost Internet\"},\"description\":\"H\\u00e1 mais de 18 anos proporcionando um servi\\u00e7o de hospedagem de sites voltado 100% na Experi\\u00eancia e Sucesso do Cliente, prezando a qualidade, transpar\\u00eancia e seguran\\u00e7a.\",\"sameAs\":[\"https:\/\/www.facebook.com\/DialHost\",\"https:\/\/www.instagram.com\/dialhost_oficial\/\",\"https:\/\/www.linkedin.com\/company\/dialhost-internet\",\"https:\/\/twitter.com\/dialhost\",\"https:\/\/www.youtube.com\/channel\/UCAiqiX8IiqTSfA8wQhpzgXQ\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/posts\/3022"}],"collection":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/comments?post=3022"}],"version-history":[{"count":0,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/posts\/3022\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/media\/2898"}],"wp:attachment":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/media?parent=3022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/categories?post=3022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/tags?post=3022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}