Estamos reescrevendo um grande aplicativo Django que usa um banco de dados MySQL, e o esquema do banco de dados precisa passar por grandes modificações. Também estamos transferindo o aplicativo para usar o PostgreSQL por alguns bons motivos.
Escrevi um pequeno script que me permite despejar as tabelas MySQL antigas em um banco de dados PostgreSQL, acrescentando seu nome com oldapp_*
Estamos começando a escrever alguns scripts de migração de dados que são basicamente:
insert into foobar(c1, c2, ..., cn)
select c1, c2, ..., cn from oldapp_foobar where ...
Agora, este aplicativo usa chaves substitutas extensivamente (o Django não permite chaves primárias compostas e encoraja fortemente o uso de substitutas). Para os primeiros scripts de migração, pulei provisoriamente as chaves substitutas do insert/select e, portanto, o PostgreSQL gera novos ids automaticamente.
Isso funciona, é claro, mas ao migrar chaves estrangeiras não é uma boa ideia. Estou pensando em várias abordagens, mas gostaria de receber algumas informações aqui.
Fique com as chaves. Você poderá, por exemplo, localizar dados em bancos de dados antigos com muito mais facilidade.
Mas lembre-se de atualizar as sequências associadas às suas chaves após a migração para que elas tenham um valor maior que a maior chave no banco de dados.
Eu geraria novas chaves substitutas como você já fez. Remove lacunas no espaço da chave.
Mas eu salvaria a chave substituta antiga por tabela em uma linha adicional para que você possa se conectar aos dados antigos de maneira confiável. Quando a migração for concluída e você finalmente liberar suas
oldapp_*
tabelas para sempre, poderá descartar as colunas adicionais.