Normalization: 'zip code' as a primary key
The page you linked to is, quite simply, wrong.

It makes no sense for a ZIP code to be a primary key in an address table.  You would expect to have multiple addresses in the same ZIP code, as you said.  ZIP codes cross city, county, and state lines which makes it uniquely poor as a key (postal codes in other countries may not be as problematic but data modelers always have to worry about the worst case).  Plus, ZIP codes change over time for an address which is not something you want in your primary keys.

In general, given that addresses tend not to have anything that works as a natural primary key, your address table will need a synthetic primary key (address_id) that has no meaning and simply acts as a primary key.  Databases have different ways to generate synthetic primary keys, sequences and auto-incrementing columns are common approaches.