Eu gostaria de construir um sistema distribuído. Preciso armazenar dados em bancos de dados e seria útil usar um UUID ou um GUID como chave primária em algumas tabelas. Eu suponho que seja uma desvantagem com esse design, pois o UUID/GUID é bastante grande e eles são quase aleatórios. A alternativa é usar um INT ou LONG auto-incrementado.
Quais são as desvantagens de usar UUID ou GUID como chave primária para minhas tabelas?
Provavelmente usarei Derby/JavaDB (nos clientes) e PostgreSQL (no servidor) como DBMS.
Depende da sua função de geração e tamanho das tabelas finais
Os GUIDs devem ser identificadores exclusivos globalmente . Conforme discutido na documentação do Postgres 8.3, não há metodologias universalmente apropriadas para gerar esses identificadores, mas o postgreSQL vem com alguns candidatos mais úteis.
Do escopo do seu problema e da necessidade de gravações off -line , você encaixotou perfeitamente o uso de qualquer coisa, menos um GUID e, portanto, não há vantagens compensatórias de outros esquemas.
Do ponto de vista funcional, o tamanho da chave geralmente não é um problema em nenhum tipo de sistema moderno, dependendo do número de leituras e do tamanho da tabela. Como uma metodologia alternativa, os clientes offline podem agrupar novos registros sem uma chave primária e simplesmente inseri-los ao reconectar. Como o postgreSQL oferece o tipo de dados "Serial", os clientes nunca precisarão determinar o ID se puderem executar uma gravação simples no banco de dados.
Mais um conselho - nunca use GUIDs como parte do índice clusterizado. GUIDs não são sequenciais, portanto, se fizerem parte do índice clusterizado, toda vez que você inserir um novo registro, o banco de dados precisaria reorganizar todas as suas páginas de memória para encontrar o local certo para inserção, no caso de auto-incremento int(bigint), ele seria apenas a última página.
Agora, se olharmos para algumas realizações de banco de dados: 1.) MySQL - as chaves primárias são agrupadas, sem opção para alterar o comportamento - a recomendação é não usar GUIDs aqui 2.) Postgres, MS-SQL - você pode fazer GUID como chave primária sem cluster e use outro campo como índice clusterizado, por exemplo autoincrement int.
Depende.
Sério, com tudo que você deu até agora, isso é o máximo que você pode ir.
Por que seria útil usar UUIDs? Por que você não usa INTs? Por que você não pode indexar em UUIDs mais tarde? Você entende o que significa ter uma lista ordenada com a chave de um UUID e inserir um UUID aleatório (não sequencial) após alguns milhões de linhas?
Em qual plataforma isso será executado? Quantos discos? Quantos usuários? Quantos registros?