Pra subir uma versão antiga da aplicação, é importante que o banco de dados esteja, também, na versão antiga. Existem várias formas de se conseguir isso, indo de um simples dump do schema a mecanismos de migração (como as migrations do Rails).
Quanto a como são geradas as versões, varia muito. O Java, por exemplo, mudou de 1.4 pra 5 por estratégia de marketing (o mesmo com o kernel do linux quando foi pra versão 3). A linha que é seguida geralmente é esta:
Versão X.Y.Z, onde:
-
X: mudanças maiores, na estrutura, com menor comprometimendo com a compatibilidade, é geralmente chamada de major version
-
Y: mudanças menores e quase sempre compatíveis entre si dentro de uma mesma versão X ou requisitando mudanças pequenas, é geralmente chamada de minor version
-
Z: correções de bug, geralmente chamada de patch
Com essa linha, por exemplo, mudanças no banco que alterem drasticamente o aplicativo (relacionamentos, colunas novas, etc.) teriam o número X diferente e mudanças menos drásticas (tamanho de campos, por exemplo) teriam o número X igual e o Y diferente.
Também é comum usar os sufixos:
- a: versão alfa
- b: versão beta
- rc: versão candidata (release candidate)
- r: versão distribuída (release), pode vir acompanhada de um número definindo um patch (ou um conjunto deles) aplicado à versão
Não sei se é mais ou menos isso que você tem dúvida.