Olá Pessoal,
Programo em Java já há algum tempo, e estou começando a aprender banco de dados agora.
Estou desenvolvendo um projeto em C# usando o SQL Server 2008 e não encontro material nem fóruns que possam me ajudar… então resolvi tirar minha dúvida aqui no GUJ, pois independe de linguagem de programação.
Pois bem, durante o desenvolvimento desse projeto me deparei com a seguinte dúvida: como eu converto as tabelas do meu banco de dados em classes do meu programa?
O banco já está pronto, devidademente normalizado com todas as tabelas criadas, mas eu não quero usar nenhum framework ou nada pronto, quero aprender como se faz de verdade, na raça…
depois eu parto pra uma solução pronta.
O que eu quero saber é que eu tenho as seguintes tabelas e relacionamentos no meu banco:

Então quando eu converter isso pra classes eu teria uma classe para cada tabela, certo? Até aí tudo bem, mas o problema são os atributos e a forma de atualizá-los, por exemplo, nas classes:
public class Onibus {
private int numeroDoOnibus;
private Linha linhaDoOnibus;
private boolean tahVoltando;
private Localizacao posicaoDoOnibus;
private List<Horario> listaDeHorarios; //lista de horários de um ônibus
//getters setters, construtores e outros métodos
}
public class Linha {
private int numero;
private String nomeDaLinha;
private Localizacao pontoDeRetorno;
private Terminal terminal;
private List<Onibus> frota; //lista de ônibus de uma linha
//getters setters, construtores e outros métodos
}
public class Terminal {
private int codigo;
private Localizacao local;
private List<Linha> linhas; //lista de linhas de um terminal
//getters setters, construtores e outros métodos
}
Aí quando eu quiser selecionar um Onibus (na camada de acesso a dados), como eu devo fazer?
Por exemplo, eu tenho que selecionar (SELECT) o onibus que eu quero, mais todas as informações da Linha dele (pra inicializar o atributo linhaDoOnibus), mais todas as informações de um terminal (para inicializar o atributo terminal do atributo linhaDoOnibus)? Isso não é muito custoso?
Além disso, se eu atualizar um dado eu irei precisar passar isso para todas as classes? Como eu vou fazer isso sem violar a arquitetura em camadas?
Como eu crio o objeto Terminal (separado) que representa o terminal de uma Linha? Esses dados não vão ficar redundantes (existem tanto no objeto terminal quanto no atributo terminal de uma Linha)?
Bom pessoal, são muitas dúvidas espero que alguém possa me ajudar!
Abraço a todos!
PS.: Desculpa esse texto enorme. 
, pois existem diversas formas diferentes de mapear classes para tabelas, passando ainda por questões de performance, como vc mesmo citou, que no seu caso seria um “eager fetch” pois você traria todos os dados de uma única vez.