Na verdade, estou em uma posição muito semelhante, gerenciando o desenvolvimento de um produto com o mesmo modelo de licença e um banco de dados principal compartilhado por diferentes funções em nosso software.
What if a part of the data model is related to an optional part? Do I build up these data structures in my application so the rest of my application can just assume they're always there? Or do I don't build them, and add checks in the rest of may application?
Eu não conheço o seu produto, mas no nosso nós entregamos sempre o modelo de dados completo. Um modelo de dados em si (ou qualquer parte dele) não é uma função de produto útil para nenhum de nossos clientes - uma função útil é um processo ou operação nesses dados, que é parte do código de aplicativos. Então, nós apenas alternamos a funcionalidade. Considere também que um modelo de dados normalizado tende a fornecer os mesmos dados para funcionalidades diferentes .
What if some optional part is still useful to perform some internal tasks, but I don't want to expose it to the user externally?
Suponho que você esteja falando sobre partes do modelo de dados - realmente importa se você o expõe ao usuário, desde que todos os processos / operações opcionais que o cliente não comprou estejam desativados? E o que "expor" significa? Se você quer dizer "expor" no nível da interface do usuário, deve ser fácil desativar essa interface do usuário. Se você quer dizer no nível do banco de dados (porque você dá aos seus usuários acesso direto ao seu banco de dados), então você provavelmente pode viver com isso.
What if the marketing responsible wants to make a standard part now an optional part? In all of my application I assume that that part is present, but if it becomes optional, I should add checks on it everywhere in the application.
Para minha experiência pessoal, as peças que são feitas opcionais são quase sempre peças que o usuário pode identificar facilmente como funcionalidades separadas. Caso contrário, o marketing teria problemas para anunciar essa função separada. Na maioria dos casos, isso significa que essas verificações não precisam ser adicionadas "em todos os lugares", mas apenas em um pequeno número de locais administráveis.