Se eu tiver uma tabela assim:
my_table
=======================
id date some_data
Faz algum sentido puxar date
para a sua própria mesa? O date
campo usaria o date
tipo de dados. Então agora ficaria assim:
my_table
==========================
id date_id some_data
dates
==========
id date
De acordo com o MySQL, date
tipo de dados = 3 bytes. O date_id
precisaria ser um máximo de MEDIUMINT
(3 bytes) para obter o mesmo resultado. Um normal INT
ou BIGINT
excede os requisitos de armazenamento de um DATE
tipo.
Uma desvantagem de uma tabela separada é que as consultas seriam mais complicadas porque estou entrando em outra tabela.
Existem outras ramificações que precisam ser levadas em consideração quanto a dividir ou não o date
campo em sua própria tabela? Minha reação instintiva é que não vale a pena fazer isso, a menos que você esteja lidando com um pequeno conjunto de datas (pequeno o suficiente para usar TINYINT
ou SMALLINT
).
Parece-me que é um exemplo clássico de pensar demais em seu design.
Mantenha as datas na mesma tabela para que possam ser facilmente indexadas com outras colunas, se necessário, e não ocupem 3 vezes mais bytes e não tornem a vida um inferno para futuros desenvolvedores.
A normalização costuma ser uma boa ideia, seja por flexibilidade ou espaço. Mas normalizar valores "contínuos", como
DATE
,DATETIME
,FLOAT
, etc, geralmente é um erro. Não faça isso.Talvez o maior problema ocorra quando você decide filtrar um intervalo de datas e descobre que o
JOIN
desempenho está matando.Mesmo que você tenha menos de 255 datas (estou pensando em
TINYINT UNSIGNED
),DATE
não vale a pena virar um id.Já que estamos falando de ids, geralmente eles devem ser
UNSIGNED
eNOT NULL
. E quase nunca éBIGINT
garantido.