Alteração no banco de dados já populado?

Venho aqui pedir sugestões e dicas na seguinte questão: desenvolvi um sistema que permite controle de fluxo de caixa do cliente, acontece que ele já vem usando esse sistema e, logicamente, o banco de dados já conta com muitos registros inseridos. Porém agora ele me pediu uma atualização e isso vai refletir em inserir novas tabelas no banco e acontecerá dessas novas tabelas receberam como chave estrangeira uma chave primária de tabelas já existentes e populadas.

Como fazer esse update? Existe algum utilitário que pode ajudar nessa tarefa? O banco de dados utilizado é o Firebird 2.5.

Não sei entendi a complexidade do seu problema. A princípio seria só você criar os scripts necessários de create table com as fks. Mas não entendi o problema.

javaflex, vou tentar ser mais especifico então… vou pegar como exemplo a situação mais simples (na minha opinião):

Atualmente o banco de dados tem (entre várias outras) uma tabela para cadastrar despesa. Uma das atualizações que o cliente quer agora é que as despesas sejam separadas por grupo. Logo terei que criar uma tabela de grupo (manutenção, contador, etc) e na tabela de despesa precisarei incluir uma coluna que receberá o id do grupo (chave estrangeira). Isso para que posteriormente num determinado relatório as despesas sejam agrupadas pelo grupo a que pertencem.

Entendi que devo fazer os scripts de atualização. Agora no caso da tabela de despesa (que já possui dados) vou incluir uma coluna que será chave estrangeira e inicialmente estarão como null o valor… será que o banco de dados vai aceitar o commit nessas condições?

Sim, basta criar a coluna aceitando null. Não trabalho com Firebird, mas na maioria dos SGDBs o default já é aceitar null, independente se vai ser FK ou não.

Por exemplo (considerando que a tabela GRUPO já está criada no banco de dados e sua chave primária é IDGRUPO):

ALTER TABLE MDESPESA ADD CONSTRAINT FK_GRUPO FOREIGN KEY (IDGRUPO) REFERENCES GRUPO (IDGRUPO)

Por default já terá como valor NULL, correto?

A definição se será null ou not null é no script de criação do campo que receberá a fk. Por default é null.

Faça um teste do script completo numa base de homologação antes de fazer em produção.

Entendi essa parte do banco de dados, obrigado.

Agora outra dúvida que me veio a cabeça, nesse sistema eu utilizei o jpa, então preciso criar essa classe GRUPO na camada model com as anotações e nas outras camadas também, correto? Utilizei o padrão MVC.

Pois assim a jpa vai gerenciar as operações de crud nessa tabela (os grupos serão criados por conta do usuário).

Em relação modelagem OO e mapeamento objeto relacional já não consigo te ajudar, vou deixar para os especialistas. Ou se preferir cria um tópico específico em relação a OO com JPA.

Valeu javaflex, obrigado pelas dicas!