Nos últimos 20 anos, vi alguns projetos de banco de dados modulares grandes e vi o cenário sugerido por David algumas vezes agora, em que os aplicativos têm acesso de gravação ao seu próprio esquema / conjunto de tabelas e acesso de leitura a outro esquema / conjunto de mesas. Na maioria das vezes, esses dados aos quais um aplicativo / módulo obtém acesso somente leitura podem ser descritos como "dados mestre" .
Naquele tempo, não vi os problemas que as respostas anteriores sugeriam que eu deveria ter visto, então acho que vale a pena examinar mais de perto os pontos levantados nas respostas anteriores.
Cenário: você amarra dois componentes diretamente a um RDBMS e vê um componente específico se tornando um gargalo de desempenho
Concordo com este comentário, exceto que este também é um argumento para ter uma cópia dos dados localmente para o microsserviço ler. Ou seja, a maioria dos bancos de dados maduros suporta replicação e, portanto, sem nenhum esforço do desenvolvedor, os "dados mestre" podem ser fisicamente replicados no banco de dados de microsserviço, se isso for desejado ou necessário.
Alguns podem reconhecer isso de maneira antiga como um "banco de dados corporativo" replicando tabelas principais para um "banco de dados departamental". Um ponto aqui é que geralmente é bom que um banco de dados faça isso por nós com replicação integrada de dados alterados (apenas deltas, em formato binário e com custo mínimo para o banco de dados de origem).
Por outro lado, quando nossas opções de banco de dados não permitem esse suporte de replicação "pronto para uso", podemos entrar em uma situação em que queremos enviar "dados principais" para os bancos de dados de microsserviço e isso pode resultar em uma quantidade significativa de esforço e desenvolvimento do desenvolvedor. também ser um mecanismo substancialmente menos eficiente.
pode querer desnormalizar o banco de dados, mas você não pode, porque todos os outros componentes seriam afetados
Para mim, essa afirmação não está correta. A desnormalização é uma alteração "aditiva" e não uma "alteração ininterrupta" e nenhum aplicativo deve ser interrompido devido à desnormalização.
A única maneira de interromper um aplicativo é onde o código do aplicativo usa algo como "selecione * ..." e não manipula uma coluna extra. Para mim, isso seria um bug no aplicativo?
Como a desnormalização pode quebrar um aplicativo? Parece FUD para mim.
Dependência de esquema:
Sim, o aplicativo agora depende do esquema do banco de dados e a implicação é que esse deve ser um grande problema. Embora a adição de qualquer dependência extra obviamente não seja ideal, minha experiência é que a dependência do esquema do banco de dados não foi um problema; por que esse poderia ser o caso? Eu apenas tive sorte?
Dados mestre
O esquema ao qual normalmente queremos que um microsserviço tenha acesso somente leitura é o mais comumente descrito como " dados mestre " para a empresa. Ele tem os dados principais que são essenciais para a empresa.
Historicamente, isso significa que o esquema no qual adicionamos a dependência é maduro e estável (algo fundamental para a empresa e imutável).
Normalização
Se três designers de banco de dados projetarem um esquema db normalizado, eles terminarão no mesmo design. Ok, pode haver alguma variação de 4NF / 5NF, mas não muito. Além disso, há uma série de perguntas que o designer pode fazer para validar o modelo para que ele possa ter certeza de que chegou ao 4NF (estou otimista demais? As pessoas estão lutando para chegar ao 4NF?).
update: Por 4NF, aqui quero dizer que todas as tabelas no esquema atingiram sua forma normal mais alta até 4NF (todas as tabelas foram normalizadas adequadamente até 4NF).
Acredito que o processo de design da normalização é o motivo pelo qual os designers de banco de dados geralmente se sentem à vontade com a ideia de depender de um esquema de banco de dados normalizado.
O processo de normalização leva o design do DB a um design "correto" conhecido e as variações a partir daí devem ser desnormalizadas para o desempenho.
- Pode haver variações com base nos tipos de banco de dados suportados (JSON, ARRAY, suporte ao tipo geográfico etc.)
- Alguns podem argumentar sobre variações baseadas em 4NF / 5NF
- Excluímos variação física (porque isso não importa)
- Restringimos isso ao design OLTP e não ao design DW, porque esses são os esquemas aos quais queremos conceder acesso somente leitura a
Se três programadores recebessem um design para implementar (como código), a expectativa seria de três implementações diferentes (potencialmente muito diferentes).
Para mim, existe potencialmente uma questão de "fé na normalização".
Quebrando alterações de esquema?
Desnormalização, adição de colunas, alteração de colunas para maior armazenamento, ampliação do design com novas tabelas, etc, são alterações ininterruptas e os designers de banco de dados que chegaram à quarta forma normal estarão confiantes nisso.
Obviamente, as alterações de quebra são possíveis descartando colunas / tabelas ou fazendo uma alteração de tipo de quebra. Possível sim, mas em termos práticos não tive nenhum problema aqui. Talvez porque se entenda o que são mudanças significativas e que elas foram bem gerenciadas?
Eu ficaria interessado em ouvir casos de alterações no esquema no contexto de esquemas somente leitura compartilhados.
O que é mais importante e significativo sobre um microsserviço: sua API ou seu esquema de banco de dados? A API, porque esse é o seu contrato com o resto do mundo.
Embora eu concorde com essa afirmação, acho que há uma advertência importante que podemos ouvir de um arquiteto corporativo, que é "Os dados vivem para sempre" . Ou seja, embora a API possa ser a coisa mais importante, os dados também são importantes para a empresa como um todo e serão importantes por muito tempo.
Por exemplo, quando houver um requisito para preencher o Data Warehouse for Business Intelligence , o suporte ao esquema e ao CDC se tornará importante da perspectiva dos relatórios de negócios, independentemente da API.
Problemas com APIs?
Agora, se as APIs eram perfeitas e fáceis, todos os pontos são discutíveis, pois sempre escolhemos uma API em vez de ter acesso local somente leitura. Portanto, a motivação para considerar o acesso local somente leitura é que pode haver alguns problemas ao usar APIs que o acesso local evita.
What motivates people to desire local read-only access?
Otimização da API:
O LinkedIn tem uma apresentação interessante (de 2009) sobre a questão de otimizar sua API e por que é importante para eles em sua escala. http://www.slideshare.net/linkedin/building-consistent-restful-apis-in-a-highperformance-environment
Em resumo, uma vez que uma API precisa oferecer suporte a muitos casos de uso diferentes, ela pode facilmente entrar na situação em que suporta um caso de uso de maneira otimizada e o restante de maneira ruim da perspectiva da rede e do banco de dados.
Se a API não tiver a mesma sofisticação do LinkedIn, você poderá facilmente obter os cenários em que:
- A API busca muito mais dados do que você precisa (desperdício)
- API do Chatty, onde você deve chamar a API várias vezes
Sim, é claro que podemos adicionar cache às APIs, mas, em última análise, a chamada à API é remota e há uma série de otimizações disponíveis para os desenvolvedores quando os dados são locais.
Eu suspeito que existe um conjunto de pessoas por aí que podem adicioná-lo como:
- Replicação de baixo custo de dados mestre para o banco de dados de microsserviços (sem custo de desenvolvimento e tecnicamente eficiente)
- Fé na normalização e a resiliência dos aplicativos às mudanças de esquema
- Capacidade de otimizar facilmente todos os casos de uso e, potencialmente, evitar chamadas remotas tagarelas / desperdiçadas / ineficientes
- Mais alguns outros benefícios em termos de restrições e design coerente
Essa resposta demorou demais. Desculpas !!