Qual é a melhor prática para armazenar metadados de registros individuais em um banco de dados?
Preciso armazenar metadados comuns, como hora de criação e hora da última atualização para muitas tabelas em meu banco de dados. Encontrei algumas soluções diferentes:
Armazene os metadados diretamente nas tabelas.
Prós:
- Os metadados estão diretamente vinculados aos registros
- Nenhuma junção é necessária para recuperar metadados
Contras:
- Muitas colunas duplicadas são necessárias (a menos que a herança seja usada)
- Metadados e dados de negócios não são separados
Crie uma tabela de metadados gerais e use chaves estrangeiras virtuais para vincular dados às tabelas e registros corretos.
Prós:
- Sem duplicação de colunas
- Os metadados são separados dos dados de negócios
Contras:
- Sem links diretos entre metadados e dados (FKs não podem ser usados)
- Junções requerem uma condição adicional
Crie tabelas de metadados individuais para cada tabela que requer metadados.
Prós:
- Os metadados estão diretamente vinculados aos registros
- Os metadados são separados dos dados de negócios
Contras:
- Muitas tabelas extras são necessárias
- Muitas colunas duplicadas são necessárias (a menos que a herança seja usada)
Existem mais opções, prós ou contras do que as que mencionei aqui? E qual é a melhor prática para armazenar esses metadados?
As colunas de que você está falando ocupam 20 bytes (se alinhadas sem preenchimento):
timestamp .. 8 bytes
timestamp .. 8 bytes
inteiro .. 4 bytes
O cabeçalho da tupla e o identificador de item para uma linha separada em uma tabela separada sozinho ocupariam 23 + 1 + 4 = 28 bytes mais os 20 bytes de dados reais, mais 4 bytes de preenchimento no final. Faz 52 bytes por linha . Ver:
Em relação ao armazenamento, você não tem nada a ganhar. Com relação ao desempenho, você quase não perde nada com apenas 16 - 24 bytes a mais por linha.
As colunas também pertencem diretamente à linha, por isso faz sentido mantê-las juntas. Tenho o hábito de adicionar exatamente essas colunas (mais fonte separada para a última atualização) a todas as tabelas relevantes.
Também é mais fácil escrever um
TRIGGER ON INSERT OR UPDATE
para mantê-los atualizados.Resumindo: um voto forte para sua opção 1 .
Onde eu iria para a opção 3 :
se os metadados forem atualizados com frequência, enquanto a linha principal não é. Então pode valer a pena manter uma tabela 1:1 separada para tornar as ATUALIZAÇÕES mais baratas e reduzir o inchaço na tabela principal - ou até mesmo optar pela opção 2.
Onde eu iria para a opção 2 :
se o conjunto de colunas de metadados for altamente repetitivo. Você pode ter uma coluna FK para o conjunto de metadados na(s) tabela(s) principal(is). Não economiza muito para três pequenas colunas como no seu exemplo.