Software design constitutes a central issue in Computer Science and its weight is very significant in university courses. The teaching of this discipline requires an adequate and balanced composition of different models, techniques, languages and tools. None of them might be eliminated if we want to ensure a complete formation of the undergraduate student. In this paper we present a methodology to teach database design which combines all these elements using both reverse and direct engineering. We also show the benefits of this approach with our practical experience over a five-year period.