Que fundamento teórico você encontrou para o design de banco de dados "Padrão de repositório"? Eu estou supondo que nenhum. É uma camada de complexidade baseada em uma premissa falsa: que a "camada de persistência" é algo de que você precisa se isolar. Pelo que posso dizer, isso contribui para o desconhecimento generalizado da programação dos princípios de design relacional e favorece uma centralidade pressuposta do design de OO do aplicativo. Mas isso não justifica sua existência por razões racionais, muito menos teóricas.
O caminho verdadeiro para o design de banco de dados não mudou em 30 anos: analise os dados. Encontre as chaves, restrições e relacionamentos muitos-para-um. Crie suas tabelas de acordo com a forma normal do Boyce-Codd. Use visualizações e procedimentos armazenados para facilitar o acesso aos dados.
Por mais indesejável que seja, um DBMS do SQL fornece uma melhor camada de isolamento do que qualquer coisa que o programador possa fornecer. É verdade que, conforme o banco de dados muda, o SQL usado para acessar pode ter que mudar. Mas observe que isso é verdade, independentemente de haver ou não uma camada de mediação . Desde que o aplicativo use visualizações e procedimentos armazenados para acessar o DBMS, as ferramentas comuns de engenharia do SQL indicarão quando alterações no banco de dados subjacente invalidam essas visualizações e procedimentos armazenados.
Aí reside o desafio, é claro. Uma camada de mediação fornece a ilusão de isolamento e o conforto para o programador de escrever código, o que ele sabe fazer. Aprender o design do banco de dados e o SQL requer aprender algo novo. A maioria das pessoas prefere morrer a pensar e muitas têm sucesso.
Alguém da sua equipe sem dúvida objetará que escrever SQL para dar suporte às suas 200 aulas é muito trabalhoso. Sem dúvida. Mas pelo menos é um trabalho útil . Se você projetar um banco de dados imitando seu design de OO, também fará muito trabalho, grande parte inútil, e derrotará a maior parte do que o DBMS oferece a você.
Por exemplo, você considera refletir a Unidade de trabalho no banco de dados (como tabela ou tabelas, presumo). Unidade de trabalho é um built-in de serviço do DBMS: begin transaction
... banco de dados de atualização ... commit transaction
. Nada para modelar, além do mapeamento de suas classes para as tabelas de banco de dados no SQL.
Sua pergunta foi publicada há 4 anos. Estou respondendo porque foi "atualizado" de alguma forma recentemente, indicando que ainda interessa a alguém. Espero que minha resposta incentive o leitor a aplicar a teoria relacional básica ao problema, em vez de adotar uma solução inútil.