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 / 14800
Accepted
adopilot
adopilot
Asked: 2012-03-13 00:23:50 +0800 CST2012-03-13 00:23:50 +0800 CST 2012-03-13 00:23:50 +0800 CST

Melhor prática para armazenar grupos de datas por valor nominal de meses-ano

  • 772

Estou fazendo um serviço que precisa manter os dados agrupados e calculados pela combinação ano-mês. Eu sei como calcular dados e colocá-los em uma nova tabela. Mas estou confuso sobre que tipo de dados devo usar para armazenar o valor do mês - ano. Aqui está o que eu considerei.

  1. Duas colunas inteiras, uma para o ano e outra para o mês (claras para entender e fortes para manipular (qualquer pessoa que use esta tabela pode facilmente usar intervalos e ordens), mas acho que isso levaria mais espaço do que outra solução.
  2. Use um campo Data e sempre armazene uma data para o mês inteiro. (Difícil explicar aos usuários como funciona e como criar cláusulas WHERE)
  3. Uma coluna varchar(7) e coloque as picadas como 2012-02,2013-01. Para mim, isso é fácil de entender, mas difícil de manipular.

Qual devo escolher? ou existe outra solução. Alguém pode sugerir de acordo com o desempenho qual caminho será uma boa solução, porque a maioria das consultas usará o intervalo de dados em que a solução e minha nova tabela terão cerca de 2 a 5 milhões de registros.

sql-server-2008 database-design
  • 4 4 respostas
  • 9622 Views

4 respostas

  • Voted
  1. Best Answer
    gbn
    2012-03-13T00:35:16+08:002012-03-13T00:35:16+08:00

    Eu usaria um campo de data com o primeiro dia de um mês e uma restrição CHECK para garantir que permaneça no dia 1.

    Isso o mantém no formato nativo de data/hora (que é sua observação sobre a opção 3)

    A opção 1 exigiria menos armazenamento, mas complicaria as comparações. E 5 milhões de linhas não são muito: você usa menos armazenamento, mas adiciona código e complexidade de consulta

    • 9
  2. Joel Brown
    2012-03-13T03:48:57+08:002012-03-13T03:48:57+08:00

    Acho que você deve escolher uma (ou mais) opções, dependendo de como os dados precisam ser recuperados .

    Para 5 milhões de registros, o espaço realmente não deve ser sua principal preocupação. Para cada uma das suas opções, aqui estão os prós e contras da recuperação :

    (1) Duas colunas inteiras: essa é uma ótima abordagem para usar se você precisar comparar meses de anos diferentes. Extrair por mês e classificar por ano será muito mais rápido se você indexar ano e mês separadamente. A opção 1 é melhor se este for um modo importante ou frequente de usar os dados. Por outro lado, esse modo é péssimo para extrair intervalos que não sejam anos e meses. Por exemplo, não é bom para intervalos que cruzam anos. A cláusula WHERE pode ficar mais complicada do que você gostaria que fosse quando os intervalos de datas ultrapassam os limites do ano civil. (Pense de novembro de 2011 a fevereiro de 2012.)

    (2) Campo de data: Você e gbn identificaram pontos positivos sobre esse formato. Também é bom para classificar cronologicamente e para extrair intervalos de meses. Acontece que é a representação mais compacta (apenas 3 bytes). Não é nada bom para comparar meses em vários anos e não é uma ideia para exibição em telas e relatórios.

    (3) char(7) YYYY-MM Field: Observe que se você está realmente preocupado com o espaço (e não deveria estar no seu caso), então você pode usar charem vez de, varcharpois cada item terá um comprimento conhecido. Usar AAAA-MM é bom para classificar e filtrar intervalos. Não é tão bom quanto (2) para espaço, mas é melhor para exibir e simplificar a cláusula WHERE - a menos que você precise extrair meses como anos.


    Você deve ter notado que há uma diferença entre (1) e (2)/(3) quando se trata da natureza da extração que você precisa fazer. Se você precisa fazer extrações de intervalo de mês/ano a ano e de mês, nenhuma dessas opções é perfeita. Se for esse o caso, sugiro que você considere usar uma combinação de (1) e (2) ou (3) - eu mesmo escolheria (3), pois valorizo ​​a facilidade de exibição/uso em vez do armazenamento espaço. Se você usar uma combinação, torne uma ou outra coluna(s) computada(s) e indexe-a para uma recuperação eficiente.

    • 3
  3. onedaywhen
    2012-03-13T06:05:33+08:002012-03-13T06:05:33+08:00

    Considere a modelagem como um período com dois valores de data -- data inicial e data final -- usando a representação aberta-fechada (o 'aberto' indica que a data final não ocorre realmente no período).

    Por exemplo, o mês atual (março de 2012) seria modelado usando a linha

    (start_date, end date) VALUES ('2012-03-01T00:00:00', '2012-04-01T00:00:00')
    
    • 1
  4. Simon Richter
    2012-03-13T07:25:55+08:002012-03-13T07:25:55+08:00

    Se você também tiver a data completa na tabela e usar a reduzida apenas para agregação, faça uma função que crie um valor normalizado, idealmente distribuído de maneira sensata (por exemplo, "meses desde janeiro de 1970") a partir da data e crie um índice em o resultado dessa função para acelerar o processo de agregação.

    • 0

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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