Existem boas razões para manter a data e a hora em colunas separadas?

9

Estou tentando entender a decisão do fornecedor de software de manter a data e a hora em colunas separadas. Por exemplo, quando a linha foi criada ou atualizada. Data e hora são colunas DateTime. Estamos usando o SQL Server 2005.

O banco de dados contém os dados do nosso sistema ERP e acredito que as maiores tabelas contenham cerca de ~ 3 milhões de linhas. A maioria das tabelas tem aproximadamente entre 100 000 - 1 000 000 linhas.

Pessoalmente, por padrão, escolheria um único DateTime para um único registro de data e hora. Isso permitiria cálculos de diferença horária mais fáceis e as partes de data e hora poderiam ser facilmente extraídas do registro de data e hora. Também consumiria menos espaço.

Separar a data e a hora é uma prática ruim ou há algo muito brilhante nesse design que eu não entendo?

miq
fonte

Respostas:

4

Meu palpite é que é uma coisa de suporte herdado (ou seja, na versão 1 do software deles, eles tinham data e hora em campos separados e foram forçados a apoiá-lo porque sempre funcionava dessa maneira).

Dito isto, não há nada brilhante em separar data e hora, então não há nada que você esteja perdendo.

(A outra opção é que os desenvolvedores do sistema ERP não sabiam que um campo de data e hora pode armazenar uma data e uma hora, mas muito mais provável é que eles tinham um requisito comercial para fazê-lo funcionar da mesma forma que nas versões anteriores.)

Simon Righarts
fonte
4

Geralmente, isso depende do uso. Se muitas consultas estiverem unindo subelementos, considere armazená-las e assumir a sobrecarga de ter que separá-las nessas ocasiões mais raras. Obviamente, dividir às vezes é mais complexo (ou impossível): considere um person_full_nameatributo do qual você precisa extrair person_family_name. Dito isso, converter um valor temporal é trivial, então eu geralmente preferiria armazenar data e hora juntos.

Considere também armazenar juntos E separados, com restrições (e talvez gatilhos) para garantir que eles não fiquem fora de sincronia: dessa forma, você assume o impacto de dividir / unir no momento da atualização, em vez de consultar o dados.

um dia quando
fonte
3

Não vejo muita utilidade para isso em um sistema operacional. Em um sistema analítico, você pode querer uma dimensão de data separada com um grão de 'dias', para que a data se vincule a rollups de datas e, talvez, uma coluna 'hora', se você quiser fazer a análise por hora do dia, por algum motivo. .

Você também pode apresentar data e hora como colunas calculadas com base em uma coluna de data e hora principal.

ConcernedOfTunbridgeWells
fonte
0

Para adicionar ao comentário do ConcernedOfTunbridgeWe, há uma vantagem no desempenho da consulta se você tiver uma tabela DateDimension e TimeDimension. Considere que a tabela de fatos possui um dateDimensionKey e TimeDimensionKey. Se você deseja encontrar o número de algo entre as 8:00 e as 17:00, basta fazer

SELECT COUNT(1) FROM FactTable f Inner Join TimeDimension t on f.TimeDimensionKey = t.TimeDimension WHERE t.Hour BETWEEN 8 AND 17.

Se você adicionou um índice ao TimeDimensionKey, precisará apenas de uma Pesquisa de Índice para o resultado em sua tabela de fatos para pesquisar dados

Sem a tabela TimeDimension, você terá que fazer algo como o seguinte,

SELECT COUNT(1) FROM FactTable f WHERE DatePart(mintue, f.Date) BETWEEN 8 AND 17

Provavelmente, isso exige uma varredura de tabela, porque o mecanismo do banco de dados precisa calcular o resultado para todas as linhas antes de descobrir quais dados podem ser retornados.

dsum
fonte