Database normalization is the process of organizing a database into simple structures that take full advantage of the relational database model. The goal of normalization is to improve organization and memory use by avoiding repeated data in rows and instead using relationships to store that repeated data just once.
Normalization is frequently defined in terms of 'normal forms', where each level of normalization adds new restrictions on how tables are laid out. In our class we are sticking to the second or third normal form - where in layman's terms tables are arranged by concern similarly to objects in Java. However, normal forms go as high as 6 levels - at the sixth level each table pretty much holds just one piece of data per row along with foreign keys to its various relationships.
Full normalization is not always ideal! While it can be memory-efficient, there is a tradeoff in processing overhead for the complex queries needed to pull data out of it. From what I've seen, fully normalized databases are also not easy to read or use with handwritten scripts. There is also the concept of 'de-normalization', where a database used for running reports will load and reorganize the data from the safe database into a form structured for fast queries to get the best of both worlds.