Cuidado com UUID em bancos relacionais!

  Рет қаралды 16,419

Waldemar Neto - Dev Lab

Waldemar Neto - Dev Lab

Күн бұрын

Vou te mostrar como utilizar UUIDs da melhor maneira
💎 Quer aprender sobre tópicos avançados de desenvolvimento e liderança? Venha para a TechLeads.club tinyurl.com/tl...
UUIDs podem causar um grande impacto negativo no desempenho de bancos de dados relacionais como MySQL e PostgreSQL devido a sua natureza randômica.
Nesse vídeo eu explico porque UUIDs são problemáticos e quais as melhores opções para resolver esse problema.
🔗 Links
planetscale.co...
shopify.engine...

Пікірлер: 92
@viniciusvasques4015
@viniciusvasques4015 22 күн бұрын
Poderia ser um vídeo de 10+ minutos de sensacionalismo porém entregou todo conteúdo em menos de 5 com qualidade. Isso que é respeitar o tempo do próximo, perfeito.
@WaldemarNetoDevLab
@WaldemarNetoDevLab 22 күн бұрын
Haha boa, produzo o vídeo que eu gostaria de assistir 🤣🤣
@geandresm
@geandresm 17 күн бұрын
Me inscrevi na hora por isso
@cardeal1389
@cardeal1389 22 күн бұрын
UUID V7 e ULID, para os casos em que precisamos de performance e índices ao se trabalhar com grandes quantidades de dados.
@yetanothercoder
@yetanothercoder 21 күн бұрын
Ia comentar isso.
@quilamcz
@quilamcz 3 күн бұрын
3:17
@gabrielrhoden2639
@gabrielrhoden2639 14 күн бұрын
90% do conteúdo do youtube é para o pessoal muito inciante. Otimo vídeo!
@shift564
@shift564 22 күн бұрын
muito bom o conteúdo, deixou claro que isso é preocupação de grande escala, sobre storage, hoje vejo JR se preocupando com storage sendo que o guri não tem 100 usuário na plataforma...
@rhialicandido8644
@rhialicandido8644 18 күн бұрын
Eu uso o ID com o index e o UUID como string, varchar, quando retorno os dados para o usuário eu escondo o ID e apresento apenas o UUID em tela, isso já resolve o meu problema ehehee!
@felipe.raposo
@felipe.raposo 14 күн бұрын
Resolve não. Porque se vc apresenta o UUID para o usuário, ele vai precisar usar esse UUID para pesquisar o registro novamente. E o seu backend vai precisar encontrar o registro baseado no UUID. Então vc vai precisar indexar esse cara de alguma forma. Você vai acabar caindo nos problemas que o vídeo explica.
@daleffi
@daleffi 13 күн бұрын
Fora que usar uuid como string vc está usando 32bytes ao invés de 16bytes como ele deveria ser nativamente. Não sei se é uma ideia ótima
@WillianMattos
@WillianMattos 8 күн бұрын
​@@felipe.raposoresolve sim. Só o cara usar o id pra pesquisar e o uuid pra validar
@rhialicandido8644
@rhialicandido8644 8 күн бұрын
​@@felipe.raposoSe você não possui um sistema ou aplicação grande igual ao do shopify ou do C6 bank é uma excelente ideia sim! Nem todo recurso que existe é o ideal para ser usado em todos os sistemas, o sistema em que trabalho funciona há 5 anos dessa forma com boa performance pq não possui uma base grande de dados. Abraço
@rhialicandido8644
@rhialicandido8644 8 күн бұрын
​@@felipe.raposoSe você não tem um sistema igual ao C6 ou do Shopify que gera milhares de registros por dia, resolve fácil, além do mais banco de dados possui views e stored procedures para ajudar na performance! Nem toda solução que existe deve ser usada! Um abraço!
@FábioLima-h7k
@FábioLima-h7k 22 күн бұрын
Muito bom! Resume toda a questão e apresenta uma solução. Apenas faltou dizer que é preferível persistir o ULID/UUIDv7 como UUID/GUID (quando suportado pelo BD) ou binário (quando não). As pessoas tendem a associar UUID com uma string, quando na verdade é um número.
@daleffi
@daleffi 13 күн бұрын
Cara esse teu comentário tem que ser emoldurado! O que eu já vi gente armazenar uuid como string e achar que está fazendo um ótimo negócio, não está escrito no gibi
@leandrosoares6
@leandrosoares6 22 күн бұрын
Conteúdo raro de excelente qualidade em menos de 5 minutos 😮
@gui_dev_
@gui_dev_ 12 күн бұрын
Que video completo! Muito bom hein 👏🏽
@JRRRRRRRRRRR
@JRRRRRRRRRRR 21 күн бұрын
muito bom, por mais vídeos assim, técnicos , objetivos, dando uma visão geral com soluções, desses desafios que temos nos projetos 👏👏👏
@vtrgomes1
@vtrgomes1 16 күн бұрын
Belo conteúdo Waldemar, há tempos sinto uma carência por conteúdos avançados. Boa!
@marcelogrsp
@marcelogrsp 5 күн бұрын
Top! Interessante demais…. Como eh bom saber os fundamentos das coisas ne
@iannascimento913
@iannascimento913 17 күн бұрын
Parabéns pelo conteúdo direto ao ponto, ainda mais pra nós de tecnologia que não gostamos de enrolação hahaha
@luizfelipeburgattjolo6578
@luizfelipeburgattjolo6578 10 күн бұрын
pesquisei agora pelo V7, ainda não conhecia! vlws!
@ManoelJunior
@ManoelJunior 17 күн бұрын
Obrigado por compartilhar conosco.
@Afonsolelis2
@Afonsolelis2 19 күн бұрын
Perfeito, já virei fâ do seu trabalho!
@Eriquen-iz8fl
@Eriquen-iz8fl 10 күн бұрын
Obrigado
@aldycolares3663
@aldycolares3663 17 күн бұрын
Bom conhecimento. Vou ver outros vídeos já que tu falou que aborda assuntos avançados.
@davidmolizane
@davidmolizane 22 күн бұрын
Conteúdo de simples comunicação e rico em conhecimento, obrigado pelo vídeo mano
@weller781
@weller781 19 күн бұрын
Uma solução que encontrei para ter um hash e o Id sequencial foi: fazer a coluna id auto incrementada e ao ter o dado já persistido no banco, pegar esse id gerado automaticamente e transformar ele em hash usando SHA256 e fazer o update na coluna x que salva o hash, para o front mando esse hash correspondente ao Id sequencial. Na época que implementei essa lógica eu sabia pouco sobre bancos e não queria ter o Id sequencial no front justamente para evitar que o usuário burlasse os dados exibidos. Achei meio gambiarra mas foi uma solução que está servindo bem rsrs
@marcosaugusto10298
@marcosaugusto10298 3 күн бұрын
Ja trabalhei em empresa de software fiscal. Uma grande empresa de telecomunicação emite pelo ao menos 100 milhoes de notas / mes. Cada nota tem 2 ou 3 items, e cada item tem no minimo 5 impostos. E são tabelas grandes, com vários campos. Fazendo a conta chegamos na cada dos bilhões de leituras. E na época existiam (não sei se ainda estão vigentes) obrigações que tinha que gerar isso nota a nota. O UUID tem o problema da perfomance e do valor do storage, que mesmo sendo "barato" hoje em dia com esse volume de dados geraria um custo a mais ao cliente sem necessidade. Sinceramente, nunca vi ninguem usar uuid nesses casos e não arriscaria também, mesmo usando id númerico ainda era necessário particionar o banco e o DBA tinha que usar configurações especificas para melhorar a performance. Mas esses casos são exceções, hoje estou num projeto menor e uso uuid, acho que vale mais a pena pela praticidade.
@whurys
@whurys 8 күн бұрын
bacana demais
@ursochurrasqueira
@ursochurrasqueira 21 күн бұрын
tem o snowflake id criado pelo twitter, ainda não cheguei a usar mas parece interessante
@carlotadias9335
@carlotadias9335 20 күн бұрын
Muito interessante ! Obrigada !
@evertonsales443
@evertonsales443 14 күн бұрын
Realmente, UUIDs sendo grandes e randômicos, em uma escalada de dados, tendem a ter mais consultas para achar seu lugar na árvore binária e a gravação sempre é mais custosa. Índices menores, quando muitos dados por segundo faz muita diferença, lembrando que não é só o custo de armazenamento, o tráfego de dados também aumenta muito... Pessoalmente só uso UUIDs para bancos baseados em documentos...
@RobsonFeDev
@RobsonFeDev 21 күн бұрын
Ótimo conteúdo, parabéns!! Também me proecupo bastante com a performance do banco, só que ao mesmo tempo voce tem que se atentar a segurança, eu ainda não utilizei esses UUID mencionados, mas sempre pensei que pelo uuid padrão ser muito randômico, ele não é uma escolha ideal para aplicações grandes, realizar query de grande volume de dados.
@WaldemarNetoDevLab
@WaldemarNetoDevLab 20 күн бұрын
Valeu Robson! Na verdade na query não tem problema de ele ser randômico. Não interfere em nada.
@gabrieljose7041
@gabrieljose7041 17 күн бұрын
Muito bom o vídeo parabéns!! Me conta aí oq tu acha de prefixo ou sufixo de IDs? Eu tenho tentado adotar isso em projetos com muitas entidades e principalmente quando tem muitas entidades relacionadas a um fluxo só, fica mais simples de saber a quem aquele ID se refere
@WaldemarNetoDevLab
@WaldemarNetoDevLab 7 күн бұрын
Interessante, eu particularmente não gosto de usar coisas fora do padrão, colocar sufixo cria um id maior que não tem nenhum padrão, UUID é um padrão conhecido, tem várias bibliotecas. No momento que tu cria o teu ele é unico e tu tem que manter.
@jamesortiz
@jamesortiz 22 күн бұрын
Ótima informação, vai ajudar muito, obrigado!
@aldairavelino3188
@aldairavelino3188 22 күн бұрын
Bem explicado, valeu por compartilhar
@polvoazul
@polvoazul 18 күн бұрын
Uma vantagem: com UUID v4 vc pode gerar novas chaves direto no cliente, sem precisar falar com o banco, salvando um roundtrip em alguns casos. Uma desvantagem: UUID sendo maior, vc gasta mais storage, o q nao eh mt relevante, mas o seus indexes ficam maiores (pq em geral vc vai ter index em ids), e ae vao caber menos no cache de memoria, e isso pode sim ter um impacto relevante em performance (pq memoria nao eh tao barato assim).
@daleffi
@daleffi 13 күн бұрын
Perfeito!
@rft13hk
@rft13hk 20 күн бұрын
Uma opção que usamos é criar uma chave composta de um campo date + UUID, assim o índice só precisa percorrer a chave da data do dia da gravação.
@WaldemarNetoDevLab
@WaldemarNetoDevLab 7 күн бұрын
Essa é a ideia que mostro no video do uuid v7 e ULID, é melhor usar um standard pra isso porque simplesmente colocar uma data na frente do uuid tu vai criar um padrão novo e vai ser maior em termos de length.
@danielvicentefagundes6774
@danielvicentefagundes6774 12 күн бұрын
Interessante
@viniciuspimentel8690
@viniciuspimentel8690 22 күн бұрын
Muito brabo, jamais pensaria nisso!
@joalisonpereiradev
@joalisonpereiradev 22 күн бұрын
Vídeo curto mas miuto informativo, valeu.
@ericnevesr
@ericnevesr 22 күн бұрын
Excelente conteúdo, muito bom!
@MakerVerse
@MakerVerse 22 күн бұрын
Nossa video sensacional obrigado
@i3xi5t51
@i3xi5t51 9 күн бұрын
Queria entender melhor o que seria "grande quantidade de dados". Atualmente, onde eu trabalho, o projeto existente tem algumas inconsistências em relação ao banco de dados. No geral, isso deve ter sido causado pelo fato de o banco relacional ter sido feito para emular a estrutura de um banco de graph twin, e não foi pensado da melhor forma. Percebi que tenho algumas tabelas com 4k ou 5k linhas, representando nós, e outras com 30k, apenas representando as conexões entre esses nós, sem contar algumas tabelas de dados que estão na casa dos milhões, mas não devem passar muito disso. Em absolutamente todo lugar é utilizado UUID, até onde não há uma necessidade real, mas não sei se o volume de dados é grande o suficiente para justificar uma troca. Ainda que nossas queries costumem demorar bastante, na escala dos segundos, como eu sei quando faz sentido trocar meu UUID v4 para, digamos, um UUID v7?
@WaldemarNetoDevLab
@WaldemarNetoDevLab 7 күн бұрын
Interessante, teria que analisar se o problema de performance é de UUIDs no geral o impacto em queries não é tão grande. Eu assumo que o problema ai é a estrutura de gráfico que deve ter muitos joins, bom era debugar as queries, e ver se todas elas tem index.
22 күн бұрын
Muito bom o vídeo! Esse caráter de aleatoriedade impacta, de fato, o índice do tipo b-tree. Mas se utilizarmos o tipo de índice hash, não mitigamos o problema? Ficaremos limitados a operação de match exato, mas que parece ser o normal quando estamos falando de chave primária e de UUID. Acha válido?
@WaldemarNetoDevLab
@WaldemarNetoDevLab 20 күн бұрын
Bom ponto! Problema do hash é que ele é chave e valor e é limitado comparado ao b-tree e também quando testei o MySQL, por exemplo, não suportava hash para chaves primarias.
@dantemesquita7751
@dantemesquita7751 22 күн бұрын
Que vídeo incrível obrigado
@RenanMiranda-c1o
@RenanMiranda-c1o 21 күн бұрын
já escutei isso algumas vezes, porém não concordo muito... a complexidade de inserção de um elemento em uma árvore binária balanceada, é O(Log(N)), independente se é randomico ou ordenado, internamente ele vai comparar um UUID com outro da mesma forma que um número é comparado, para jogar ele para esquerda ou direita em cada nível da árvore. mesmo que o banco aproveitasse o fato de ser sequencial para não criar uma árvore e sim algo próximo a uma lista bulkerizada ordenada, onde a complexidade de insert seria O(1) (o que desconheço que ele faça), o UUID vai ter que ter um indice de qualquer forma, para buscar pela chave, na maioria das vezes um campo de código desses não fica sem indice, dessa forma a complexidade do insert não vai mudar mesmo você tendo uma PK numérica. Vai haver uma melhoria nos JOINS, porque que individualmente comparar um uuid com outro é mais custoso do que comparar um número com outro, devido a quantidade de bits de um uuid ser muito superior, contudo é uma diferença constante na complexidade, não é linear, nem exponencial, o que não deveria ser um grande problema na prática. (tanto a consulta por UUID numa BTREE quanto a por Numero tem complexidade O(Log(N))) convivo com aplicações que lidam com grandes quantidades de dados e requisições e trabalham com UUID na chave, e esse nunca foi o problema, o tempo das queries costuma ser semelhante a de aplicações que tenho com volume de dados parecido e chave numérica, por ser uma diferença constante de performance, não linear nem exponencial, costuma ser pouco perceptivel, o que mais costuma fazer diferença é o plano de execução das consultas, e ter os indices criados corretamente para cada situação. Fora isso a complexidade de gerar um numero auto increment é maior que gerar um UUID, você precisa de um mecanismo de sequence para isso, que geralmente não é escalavel, porque que é um mecanismo thread-safe para geração de números sequenciais, contudo, para ele ser thread-safe, precisa sincronizar a operação, ou seja, todas as threads da sua aplicação em todas as instancias que ela tiver rodando, vão ter que aguardar uma a outra, para geração desse id numérico. Mas assim, concordo que há de fato uma melhora constante nas operações de consulta, mas pra min nunca justificou a troca, trabalho com microsserviços que fazem centenas de milhares de consultas ao banco por minuto, com centenas de milhões de dados em banco, e nunca tive problema com isso. Talvez se for um cenário super extremo, com bilhões de dados, e milhões de consultas por minuto, esse tipo de otimização começe a fazer uma diferença maior, mas vejo que é a minoria dos casos.
@WaldemarNetoDevLab
@WaldemarNetoDevLab 20 күн бұрын
Massa teu ponto Renan, tu já fez benchmarks de escrita? Atualmente estou trabalhando em um SaaS multi tenant com milhares de dados e os benchmakrs de escrita diferem bastante quando movemos de uuid v4 para v7 em operações de escrita que precisam mexer no index. Sobre query eu nem mencionei porquê o impacto é realmente minimo.
@daleffi
@daleffi 13 күн бұрын
​@@WaldemarNetoDevLabeu acho que as consultas sofrem sim pois se sua chave for um uuid elas vão estar mais espalhadas nas páginas de dados, consequentemente suas consultas vão ter que levantar mais páginas do cache do banco. O seu plano apresentará mais operações de I/O do que se fosse uma chave numérica.
@YouTubeDoNatan
@YouTubeDoNatan 16 күн бұрын
Então é ruim deixar que o banco de dados crie o id automático para o usuário?
@rafa_veiga
@rafa_veiga 21 күн бұрын
Confesso que fiquei mto tempo parado usando o uuid v4, as próximas vou usar o v7 pra ver a diferença.
@Aliengrato
@Aliengrato 3 күн бұрын
@algonix11
@algonix11 5 күн бұрын
o uuid só faz sentido em arquitetura realmente distribuida, onde um fragmento da rede nao tem contato nenhum com as demais. e mesmo nesse cenário um random de 64bits faz o o mesmo trabalho mas com muito mais eficiencia.
@_boraprogramar
@_boraprogramar 4 күн бұрын
Existem outras abordagens como adicionar id-idbanco ou ainda deixar um serviço na frente do banco para gerar os ids sequenciais, ou separar um range de ids para cada banco
@tiagoleomil4329
@tiagoleomil4329 20 күн бұрын
Ganhou mais um inscrito
@AlvesNamor
@AlvesNamor 17 күн бұрын
E quais bancos de dados tem suporte a UUID v7 sabendo da ordenação temporal?
@WaldemarNetoDevLab
@WaldemarNetoDevLab 7 күн бұрын
O banco não precisa suportar tu vai salvar em um campo string.
@kelvincesar_
@kelvincesar_ 21 күн бұрын
No postgres vocês usam a extensão do ulid? Ou criam ele na camada de app e armazenam como uuid mesmo?
@WaldemarNetoDevLab
@WaldemarNetoDevLab 20 күн бұрын
Sempre criei no app, para não depender muito do banco para isso.
@kelvincesar_
@kelvincesar_ 19 күн бұрын
@@WaldemarNetoDevLab boa, também acho mais fácil. Abraço e parabéns pelo vídeo!
@Pedroallesss
@Pedroallesss 22 күн бұрын
mt bom!
@jeffersonsilva763
@jeffersonsilva763 21 күн бұрын
Gostaria de saber como isso iria implicar em um banco de dados de escrita escalando na horizontal, recebendo multiplas inserções no mesmo milisegundos em uma alta demanda. Pois o twitter usa o "Snowflake" pra resolver esse problema.
@WaldemarNetoDevLab
@WaldemarNetoDevLab 20 күн бұрын
Massa Jefferson, em termos de escrita não tem problema nenhum. O Twitter usa o snowflake porquê ele é menor e também não tinham muitos padrões ordenáveis no passado.
@cleitinho-dev
@cleitinho-dev 22 күн бұрын
Dúvida o KSUID é uma boa solução?
@WaldemarNetoDevLab
@WaldemarNetoDevLab 22 күн бұрын
Nunca testei mas é um padrão estável, acho que é uma opção valida.
@oazevedolucas
@oazevedolucas 22 күн бұрын
Cara eu tenho uma dúvida. Se eu vou trabalhar com grande quantidade de usuarios exemplo +1milhão, não chega um ponto que extoura o maior número possível?
@HumbertoRamosCosta
@HumbertoRamosCosta 21 күн бұрын
1 milhão de registros em bancos de dados hoje é trivial Mesmo que você delete e crie outros registros é praticamente impossível ultrapassar o espaço amostral tanto do UID quanto da chave sequencial.
@_boraprogramar
@_boraprogramar 4 күн бұрын
Tenho 4 anos de experiência e nunca precisei usar uuid 😅
@Kimitri
@Kimitri 22 күн бұрын
tem como fazer isso depois q já tem um banco de dados só com uuids ?
@WaldemarNetoDevLab
@WaldemarNetoDevLab 20 күн бұрын
Puts, ai da trabalho, tem que atualizar todos os relacionamentos, e se existem sistemas externos que dependem dos dados e salvam o id no lado deles vai ser bem dificil.
@VictorHenrique17
@VictorHenrique17 22 күн бұрын
Setar o indice pra usar hash já não resolve o problema ?
@WaldemarNetoDevLab
@WaldemarNetoDevLab 20 күн бұрын
Bom ponto! Problema do hash é que ele é chave e valor e é limitado comparado ao b-tree e também quando testei o MySQL, por exemplo, não suportava hash para chaves primarias.
@heliobras9466
@heliobras9466 5 күн бұрын
O índex não usa árvores binária, ele usa B-tree
@FlavioAugustoToldo
@FlavioAugustoToldo 19 күн бұрын
como saber qual a versão está sendo usada?
@WaldemarNetoDevLab
@WaldemarNetoDevLab 7 күн бұрын
Pode colar um id no chatgpt e perguntar pra ele explicar
@romulo123skate
@romulo123skate 22 күн бұрын
niceeee
@joonasalb
@joonasalb 22 күн бұрын
Dúvida, como o banco sabe lidar com a ordenação de acordo com caracteres? como que esse sabe que esse cara por exemplo: 018aab68-d2dd-78f1.. é antes do 018aab68-d2dd-78f2? Por que eu digo, como o UUID é aleatório, ele acaba ordenadando mesmo assim porém a ordenação acabaria estando errado? kkkkkk fiquei muito nessa dúvida
@WaldemarNetoDevLab
@WaldemarNetoDevLab 20 күн бұрын
Essa é uma ótima pergunta, como o timestamp está no início, comparar duas strings de UUID v7 em ordem lexicográfica (alfabética) reflete a ordem temporal em que foram geradas. Índices B-Tree utilizam a ordem lexicográfica das chaves para organizar os dados. Portanto, UUIDs v7 se beneficiam diretamente dessa característica, permitindo buscas e ordenações eficientes.
@zkira445
@zkira445 20 күн бұрын
E a chave aleatória do pix? Kkk
@infocastell
@infocastell 22 күн бұрын
Legal, não sabia disso. Já salvei. Valeu!
@dami-i
@dami-i 17 күн бұрын
Esse tipo de conteúdo é bem bacana. Embora fiquei perdido algumas vezes por conta da pronúncia do termo "UUID" se confundir com "o ID". Seria mais fácil de fazer a distinção se fosse usada a pronúncia em inglês "you you ID".
só dizer “Stop Using UUIDs” é uma péssima dica
21:27
Lucas Montano
Рет қаралды 61 М.
Estão HUMILHANDO os DEVS nas Entrevistas Técnicas...
8:51
Flutterando TV
Рет қаралды 16 М.
How To Get Married:   #short
00:22
Jin and Hattie
Рет қаралды 30 МЛН
🕊️Valera🕊️
00:34
DO$HIK
Рет қаралды 1,5 МЛН
How do Cats Eat Watermelon? 🍉
00:21
One More
Рет қаралды 13 МЛН
Começando como Tech Lead? Evite esses erros!
25:39
Waldemar Neto - Dev Lab
Рет қаралды 1,7 М.
Cuidado com UUID em bancos relacionais!
5:38
BrazilJS
Рет қаралды 317
Nix explained from the ground up
23:39
Surma
Рет қаралды 40 М.
O MAIOR PROBLEMA DO PYTHON FINALMENTE RESOLVIDO
27:01
CodeShow
Рет қаралды 32 М.
Go: A Linguagem de Programação Que Está Transformando o Mercado
11:20
Esse programa é tipo um SEGUNDO CÉREBRO e é assim que EU uso...
24:40
A batalha pela principal tecnologia do mundo
19:25
Atila Iamarino
Рет қаралды 201 М.
Writing My Own Database From Scratch
42:00
Tony Saro
Рет қаралды 238 М.
How To Get Married:   #short
00:22
Jin and Hattie
Рет қаралды 30 МЛН