Minha equipe tem medo de entidades de banco de dados relacionais com relacionamentos de chave estrangeira e não entendo por que


12

Estou relativamente recém-saído da faculdade, por isso a maior parte da minha familiaridade com bancos de dados relacionais é do meu curso de bancos de dados, onde qualquer coisa que não esteja no BCNF ou no 3NF é uma farsa. Certamente esse é um extremo, mas minha equipe no trabalho realmente leva isso ao extremo oposto.

Em nossos esquemas de microservice db, as entidades raramente têm mais de uma única tabela. Tudo o que você normalmente normalizaria em outra tabela é armazenado em uma coluna json. Se for descoberto posteriormente que uma das propriedades desse json precisa ser consultada, uma nova coluna será adicionada e os dados serão armazenados nos dois locais (sim, em duas colunas diferentes na mesma tabela).

Em muitos casos, essas colunas json definitivamente têm uma vantagem. Se você nunca precisar consultar esses dados e nunca precisar fazer uma alteração unilateral nesses dados (o que obviamente não pode prever), não é uma má idéia. Além disso, muitos de nossos serviços não veem servidor ou estão hospedados em máquinas com uma quantidade obscena de espaço em disco para o que precisavam, portanto a duplicação de dados não é um grande problema. (Embora algo que eu geralmente gostaria de evitar fora da filosofia)

Atualmente, estamos construindo um serviço que corresponde às regras com base em um conjunto de condições que elas possuem e, em seguida, executa um conjunto de ações associadas a essas regras quando as regras são verdadeiras (por exemplo, todas as condições são verdadeiras). Minha sub equipe que mais imediatamente construiu esse serviço acredita que há um benefício substancial em normalizar ações e condições fora das regras do esquema. Obviamente, essas tabelas mantêm relacionamentos de chave estrangeira com o ID da regra. Da nossa perspectiva, podemos evitar a duplicação de dados em condições, o que nos permite garantir que eles sejam avaliados apenas uma vez e é fácil encontrar as condições e regras necessárias quando precisar delas, sem precisar extrair todas as regras e fazer a pesquisa na memória.

Hoje, conversando com um de nossos principais engenheiros, ele tentou me afastar desse esquema. Tentar argumentar de todas as maneiras que nós realmente não precisamos, isso causará problemas de desempenho no futuro, referenciando um antigo monólito que possuímos que é um travesti de design. Ele se referiu ao que estamos fazendo como "o caminho antigo" e as tabelas planas com json como "o novo caminho". Ele argumentou que em lugares onde eu quero atomicidade, não precisamos dela e que, em vez de consultas, devemos fazer mais coisas na memória. Esse é um princípio de design que muitos de nossos serviços seguem agora. Não prevemos que o volume de nossos dados aumente substancialmente, o que deve manter nossas consultas rápidas. O que antecipamos é muito tempo gasto na avaliação de regras e na execução de ações.

Entendo que bancos de dados não relacionais se tornaram mais populares nos últimos anos, mas mesmo ao pesquisar ativamente informações sobre as implicações de desempenho dos relacionamentos com chaves estrangeiras, não vejo muita informação justificando seu argumento. Suponho que eles tendem a introduzir grandes transações que podem causar problemas, mas isso parece ser um problema independente da própria chave estrangeira.

Esta é a minha ingenuidade? Ou existe realmente algo que eu e minha sub-equipe estamos perdendo? Eu explicitamente não forneci informações detalhadas sobre o nosso problema, porque não estou necessariamente procurando uma solução para isso. Dado que é uma tendência comum em nossa equipe maior, estou realmente curioso para saber se eles estão envolvidos com isso.


A resposta para sua pergunta no título seria "Eles estão assustados por causa do antigo monólito da sua empresa". Mas o corpo da sua pergunta parece perguntar algo completamente diferente, ou seja, "As chaves estrangeiras introduzem problemas de desempenho?"
Christian Hackl

2
Gostaria de saber qual% de um RDBMS eles criaram no código "app"
Caleth

Se a abordagem é boa ou não, depende do tipo de aplicativo que você está construindo, de suas necessidades e da direção a seguir (requisitos, restrições de arquitetura) - algo que não podemos avaliar aqui. Quanto ao NoSQL - a coisa toda era sobre o suporte à enorme capacidade de venda horizontal e o reconhecimento de que nem todos os aplicativos exigem as restrições estritas do RDBMS. Para saber mais, use as 3 principais respostas aqui como ponto de partida (a segunda e a terceira são mais detalhadas).
Filip Milovanović

2
Se eu puder oferecer algum conselho não técnico: diminua um pouco. Você está julgando muito ("sim, em duas colunas diferentes na mesma tabela", "travesti de design") sobre o trabalho em que não teve nenhum envolvimento nas decisões de design e o fez a partir de uma posição de experiência mínima no mundo real . Não posso dizer que você está certo ou errado, porque eu não vi o projeto, mas os sistemas tendem a ser uma série de compromissos, resultando no produto final sendo funcional, mas menos do que conceitualmente puro. Isso ficará mais claro à medida que sua carreira progride e a tomada dessas decisões se torna parte de seu trabalho.
Blrfl 01/03/19

@Blrfl Coloque excelentemente
Robbie Dee

Respostas:


8

A palavra-chave aqui para entender de onde vem sua equipe é "microsserviços". Vale a pena ler primeiro esse conceito, principalmente para as seguintes informações:

  • Como os dados devem ser armazenados?
  • Princípios de design?
  • Como eles são projetados para escalar?

Como em qualquer maneira relativamente nova de fazer as coisas (e 5 a 10 anos é relativamente novo quando se trata de arquitetura de software), você verá que os ideais e a realidade são um pouco diferentes.

Um dos ideais é que todo microsserviço tenha seu próprio armazenamento de dados. NOTA: Eu disse armazenamento de dados, não banco de dados. Há casos em que você simplesmente deseja um mecanismo de pesquisa, armazenamento de blob ou cache simples, em oposição a um banco de dados comum. Dependendo de quem você fala, esse ideal pode até ir a um repositório de dados por instância de microsserviço!

Resumindo, quando você está falando sobre ir para a escala da Internet, a segurança e a familiaridade das transações ACID (Atomicidade, Consistência, Isolamento e Durabilidade) simplesmente não aumentam quando você tem milhões de usuários em um banco de dados. Com o advento do NoSQL, o paradigma mudou mais para o BASE (Basicamente disponível, estado flexível, consistência eventual). ( referência )

Há um impacto na alteração do PH de como você gerencia dados:

  • As coisas que o banco de dados costumava cuidar de você precisam ser gerenciadas no código agora
  • É mais fácil escalar lançando mais instâncias de microsserviço em um problema do que adicionar recursos "infinitos" a um servidor
  • Você aumenta a confiabilidade ao custo de maior complexidade

Não posso responder pelos detalhes de sua equipe ou por quanto eles pretendem que a solução seja, mas normalmente você não precisa ter uma solução de tudo ou nada. Não vou me sentar aqui e julgar se a equipe está fazendo as escolhas certas. Estou apenas fornecendo a você algum contexto para que você possa pelo menos entender de onde eles vêm.


+1 Ótimas coisas - existem muitas sutilezas nos microsserviços, com certeza isso significa que não se trata apenas de trocar bancos de dados.
Robbie Dee

@RobbieDee, concordou. Há muita complexidade nesse mundo, e nem todos concordam com os detalhes.
Berin Loritsch 01/03/19

Essa deve ser a resposta. O pouco sobre cada microsserviço que possui seu próprio armazenamento de dados é realmente o fator de diferenciação. Faz uma grande mudança nas suas necessidades e soluções de armazenamento de dados, e um armazenamento de dados compatível com ACID não é mais um benefício como costumava ser.
precisa

7
É uma boa resposta, e eu a votei. Gostaria apenas de salientar que o que você chama de "escala da Internet" se aplica apenas às maiores empresas; para a grande maioria dos bancos de dados e sites corporativos (eu diria que 95% deles), os bancos de dados SQL normalizados "convencionais" ainda são perfeitamente viáveis.
Robert Harvey

@RobertHarvey, eu concordo plenamente. Eu li vários artigos sobre microsserviços que especificam o que escrevi. Em nossos próprios projetos, usamos um banco de dados SQL com normalização e restrições adequadas. Isso machucaria o coração do purista, mas a realidade é que nossa base de usuários é bastante pequena (centenas ou usuários) e o banco de dados não tem sido um problema de desempenho para nós.
Berin Loritsch 01/03/19

3

OK, não sendo o principal engenheiro do projeto, você realmente precisa seguir as instruções dele para esse projeto.

Gostaria de encorajá-lo a trabalhar com seu próprio design do sistema e com o protótipo dele em casa, para que você entenda as vantagens e desvantagens. Faça isso para sua própria educação e mencione apenas no trabalho quando puder demonstrar exemplos de trabalho.

Minha experiência foi que há uma alegação de que restrições causam uma lentidão no desempenho do banco de dados. E sim, você terá que verificar essas restrições. No entanto, é um problema muito maior quando o banco de dados é inconsistente e isso faz com que você escreva SQL e mais código para compensar, geralmente aumentando a complexidade do sistema e diminuindo a velocidade.

O 3nf, quando feito de maneira apropriada, tornará o banco de dados mais rápido, pois mais deles podem ser armazenados em cache, pois há menos dados redundantes sendo armazenados. No entanto, em seu trabalho atual, pode não haver um conjunto de dados grande o suficiente para realmente ver a diferença de desempenho entre um banco de dados normalizado e um não normalizado.


+1 Ótima idéia. E se os volumes forem grandes demais para uma máquina de desenvolvimento, uma amostra de 1 em N também pode gerar excelentes insights.
Robbie Dee

2

Eu acho que eles têm medo de recriar o mesmo velho "travesti" que existia antes, em vez da própria Integridade Referencial.

Ele argumentou que em lugares onde eu quero atomicidade, não precisamos disso ...

Se você pode apresentar um argumento sólido (também conhecido como Requisito Não-Funcional) por precisar de atomicidade, eles precisarão de um bom e sólido contra-argumento para não fornecê-lo.

... em vez de consultas, devemos fazer mais coisas na memória. Esse é um princípio de design ... Não esperamos que o volume de nossos dados aumente substancialmente ...

Vamos torcer você esteja certo. Eu sugeriria que confiar nos dados permanecendo "pequenos o suficiente" para permanecer com desempenho é arriscado.

Além disso, qual é a taxa de alteração dessas regras? Quanto mais duplicação você tiver, mais tempo (também conhecido como dinheiro) estará perdendo atualizando a mesma coisa em vários lugares.


1

Os principais conceitos por trás dos RDBMSs têm mais de 40 anos. Naquela época, o armazenamento era muito caro e qualquer tipo de redundância era desaprovada. Embora os conceitos por trás dos RDBMSs ainda sejam sólidos, a idéia de desnormalização do desempenho (para reduzir junções) tornou-se comumente aceita nas últimas décadas.

Portanto, para um RDBMS de um determinado tamanho, você normalmente tem seu design lógico (sem redundância) e seu design físico (com redundância) para desempenho.

Avançando hoje, onde o armazenamento é barato e os processadores estão mais rápidos do que nunca, algumas dessas pressões de design não são tão importantes. Por fim, é uma decisão sobre se você se importa com redundância e registros órfãos. Para alguns setores, como o setor bancário, a correção dos dados é vital, por isso é difícil ver como eles se afastarão dos RDBMSs. Para outras indústrias, novos players estão entrando no mercado o tempo todo, portanto as opções são inúmeras.

Quanto à sua equipe se sentir desconfortável com as restrições que um RDBMS pode trazer - quem sabe? Certamente os desenvolvedores juniores que eu vejo não têm o RDBMS nous que os desenvolvedores das gerações anteriores tinham, mas isso provavelmente está mais relacionado à proliferação de tecnologias para desenvolvedores e plataformas de banco de dados.

Não existe um fim para as tecnologias que um desenvolvedor pode aprender e pode ser difícil dar o pontapé certo para sua carreira. Certamente, os dias em que os desenvolvedores são o principal alvo de todas as negociações já se foram há muito tempo - há muito que se pode aprender.

Mas - para a pergunta em questão. Por sua própria admissão, você não espera que o volume de dados aumente e o sistema tenha um bom desempenho. Seria um exagero vender a ideia de reprojetar coisas sem nenhum benefício perceptível. Talvez se você pudesse fazer uma prova de conceito em que uma abordagem RDBMS tivesse benefícios, isso seria uma história diferente.


1
por que isso é prejudicado? esta é uma resposta equilibrada. Pragmatismo +1
Dirk Boer

O pragmatismo é bom, mas você ainda deve ter cuidado. A desnormalização dos dados em nome do desempenho no início de um projeto cheira a otimização prematura. Não reprojetar um sistema antigo que está funcionando é obviamente uma escolha boa e pragmática, mas recusar-se a projetar um novo sistema de acordo com os padrões do setor em nome de "sempre fizemos o oposto e funciona" está longe de ser um bom argumento. .
Vincent Savard

Desnormalizar dados em nome de desempenho no início de um projeto ... Dica: você não :)
Robbie Dee

1
O valor de um RDBMS não vem da eficiência do disco.
TehShrike

0

Depende do banco de dados que você está usando.

Em um RDBMS tradicional, você está certo. A duplicação de dados é uma abominação. As colunas e sua equivalência json inevitavelmente ficarão fora de sincronia porque não há nada para aplicá-las. O suporte a chaves estrangeiras é bem conhecido, faz um ótimo trabalho na descrição e aplicação de relacionamentos. E a atomicidade é vital para fazer quase qualquer coisa com dados.

Em um tipo de configuração nosql, é menos claro. Como não existem relações firmes, a aplicação das relações se torna menos importante. Esse tipo de conteúdo json com índice de coluna é muito mais comum nesses sistemas, porque nenhuma relação significa menos probabilidade de ficar fora de sincronia. E a atomicidade é restrita à tabela única, porque é assim que o nosql funciona.

O que é melhor depende do que você está realmente fazendo e do que realmente precisa.

Mas parece que seus colegas de trabalho estão em um culto à carga. Eles foram picados por coisas velhas e ruins, então agora as coisas precisam ser a nova coisa brilhante. Em alguns anos, depois de serem mordidos pela nova coisa brilhante, esperançosamente perceberão que SQL vs noSQL é um conjunto de vantagens e desvantagens.

Mas eles não vão. Espero que você vai embora.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.