As duas opções em que pensei são adicionar uma coluna booleana chamada Current na tabela; mas tenho certeza de que isso violaria algum nível de normalização devido a mais de um registro poder ser definido como atual.
Como alternativa, ter outra tabela que especifique o ID do registro atual, mas também não parece uma ótima maneira de fazer isso.
Existe uma maneira ou convenção melhor para alcançar esse tipo de coisa?
Edit: Eu provavelmente deveria ter dito que só pode haver um registro atual, então quando ele é alterado, o registro atual anterior precisa que seu status 'atual' seja removido. O sistema não é complicado o suficiente para precisar se preocupar com simultaneidade ou algo assim. O principal motivo da pergunta é que eu queria fazer as coisas da maneira correta/convencional, se houvesse.
Acredito que a melhor maneira é ter uma tabela de configurações que contenha o ID do registro atual .
Eu vi várias abordagens para isso:
uma coluna indicadora booleana (se o DBMS escolhido suportar isso) ou caractere (por exemplo, 'Y', 'N');
uma coluna de "status" mais geral, contendo valores como 'ACTIVE','HISTORY','EXPIRED' etc.
um par de colunas de carimbo de data/hora (por exemplo, START_DT, END_DT), indicando o intervalo de datas em que um determinado registro está (estava) ativo. O registro atual teria o valor END_DT no futuro, como '9999-12-31', o que simplifica a consulta do registro atual:
...where current_date between START_DT and END_DT
uma tabela de histórico onde todos os registros não atuais seriam movidos assim que se tornassem não atuais. Se você está interessado apenas nos registros atuais, você deve consultar a tabela atual , caso contrário, você deve consultar uma exibição que
UNION ALL
contém tabelas atuais e históricas.Nos três primeiros casos, você precisaria garantir a consistência por meio de algum tipo de restrição, se seu aplicativo não puder fazer isso.
Qual abordagem você escolhe depende do que constitui o registro atual em seu caso particular.
Supondo que cada login possa ter um 'registro atual', você pode ter uma tabela na forma de:
No entanto, será necessária a manutenção desta mesa e a limpeza posterior.
Se o 'registro atual' for baseado no aplicativo cliente, talvez apenas persista na memória e passe o current_id (ou equivalente) para quaisquer consultas, procedimentos e assim por diante que você usar.
Se você estiver preocupado com a simultaneidade, use os bloqueios apropriados para controlar essa parte da imagem.
EDIT: Com base na sua atualização, como há um único 'registro atual', concordo que uma tabela de uma linha com o ID do registro atual é suficiente.