Uma maneira é projetar seus modelos antes de projetar seu banco de dados. Ao projetar seus modelos, o foco é capturar a lógica e os significados do negócio no domínio do problema. Isso deve ser capturado de uma maneira que faça sentido para os negócios, incluindo mais do que apenas entidades e campos de dados. Alguns elementos de dados são interpretados por outros, outros dependem de outros etc. Além disso, você adicionaria a este modelo qualquer lógica básica necessária, como a forma como um objeto responde internamente quando um determinado elemento é definido com um determinado valor.
É bem provável que você termine com algo 90% mais idêntico ao de como você mantém os dados. Isso é bom. Pode ser completamente idêntico sem ser acoplado.
Observe também que modelar o domínio em meio a uma verdadeira ignorância de persistência é um pouco do santo graal para o design de software. Se você pode fazer isso, fantástico. Mas se o domínio do problema é significativo e tem alguma complexidade, ainda é uma boa idéia voltar da modelagem de domínio de tempos em tempos para fazer uma verificação de integridade na persistência dos dados para garantir que você não tenha pintado -se em um canto.
Lembre-se das funções reais dos vários componentes e mantenha-as separadas quando as projetar. Para qualquer decisão de design, pergunte-se se alguma dessas funções é violada:
- Banco de dados - armazene os dados, mantenha a integridade dos dados, mantenha os dados em repouso.
- Modelos - Conter a lógica de negócios, modelar o domínio do problema, manter os dados em movimento, responder a eventos em nível de negócios etc.
- Exibições - Apresente dados aos usuários, execute a lógica do lado do usuário (validação básica antes da validação verdadeira nos modelos, etc.).
- Controladores - responda a eventos do usuário, passe o controle para modelos, direcione solicitações e retorne respostas.