AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 124936
Accepted
ReynierPM
ReynierPM
Asked: 2016-01-01 07:27:20 +0800 CST2016-01-01 07:27:20 +0800 CST 2016-01-01 07:27:20 +0800 CST

Qual é a melhor maneira de diagramar essa "relação" procurando desempenho e | ou economia de espaço em disco

  • 772

Estou trabalhando em um diagrama de banco de dados e tenho uma tabela chamada cm_identifier_type. Cada registro desta tabela pode ter ou não um arquivo para download (salvo um caminho de arquivo). Identifiquei duas maneiras possíveis de conseguir isso.

  • Coloque uma coluna download_filecomo VARCHAR(250)e defina como NULLpadrão (isso porque nem todos os registros terão um download relacionado)

insira a descrição da imagem aqui

  • Crie uma relação entre cm_identifier_typee uma nova tabela cm_download_file:

insira a descrição da imagem aqui

Agora, em relação ao desempenho, economia de espaço em disco, economia de consulta e assim por diante, como você faria isso? Qual é a sua recomendação sobre este caso extremo?

Nota: no momento estou usando MariaDB 10.1.x, mas isso será em uma instância do MySQL, provavelmente 5.x ou mais, não tenho certeza, pois ainda não tenho esses detalhes

mysql database-design
  • 2 2 respostas
  • 68 Views

2 respostas

  • Voted
  1. Best Answer
    Joel Brown
    2016-01-01T09:30:36+08:002016-01-01T09:30:36+08:00

    Se você tiver muitas estatísticas específicas sobre a frequência com que suas colunas opcionais serão nulas e com que frequência as colunas não nulas precisam ser lidas (em oposição às colunas principais e obrigatórias), você poderá calcular a economia de espaço (ou não) e no mínimo, você poderia derivar alguns experimentos de desempenho para testar cada abordagem.

    Não existe uma regra prática sobre se é "melhor" segregar colunas opcionais em uma tabela separada.

    "Melhor" é um termo subjetivo. O que tem valor? Espaço em disco, ciclos de CPU, tempos de resposta de consulta, simplicidade de código? Você não pode considerar os méritos relativos de uma abordagem em detrimento de outra sem primeiro considerar o que está tentando otimizar.

    Existem vários motivos pelos quais você pode querer mover colunas opcionais para uma subtabela relacionada 1:1 separada. Veja minha resposta a esta pergunta para mais discussões sobre esses motivos.

    No seu caso, como você está preocupado com o espaço, precisa ter em mente algumas coisas sobre como os dados são armazenados fisicamente:

    • Strings de tamanho variável não ocupam muito espaço se estiverem vazias.
    • Cada coluna anulável precisa de um bit para indicar se é nula ou não.
    • Uma tabela separada com colunas opcionais precisa armazenar a chave primária da tabela principal novamente (como uma chave estrangeira) e pode haver um índice separado nesta coluna também.

    Há muitas influências concorrentes sobre qual ocupa menos espaço e qual tem melhor desempenho. Você precisa considerar:

    • Com que frequência os dados opcionais vão faltar? Se for realmente raro, talvez você economize espaço segregando-o.
    • Com que frequência você precisa ler os dados opcionais? Se você lê sempre (esteja lá ou não), então talvez juntar-se a ele o tempo todo seja menos eficiente.
    • Por outro lado, se não estiver lá com muita frequência e se você quase nunca o ler, mesmo quando estiver, talvez seja mais eficiente ler registros mais curtos contendo apenas as colunas obrigatórias?

    Outra coisa a considerar, talvez até a coisa mais importante a considerar, é se você está pensando demais no problema ao tentar pré-otimizar. O disco é muito barato. CPU é muito barato. Programadores são caros. A menos que você precise se preocupar com escala massiva, talvez a melhor resposta seja aquela que deixa você com o código mais simples (com menos bugs, mais fácil de manter).

    • 5
  2. Renzo
    2016-01-01T09:27:44+08:002016-01-01T09:27:44+08:00

    Acho que a melhor opção é a primeira solução, já que o campo é um VARCHAR: isso significa que nenhum espaço significativo é ocupado se o valor for NULL.

    Por outro lado, com a segunda solução você tem uma tabela a mais para manter, outros índices, precisa juntar se precisar do valor, etc. Muita trabalheira para um problema que pode ser resolvido de forma bem simples.

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve