Duplicated table for each website user
IMHO

The original layout looks like it is a self-built implementation of Row Level Security (RLS).  RLS allows the developer to limit the available rows based on who is logged in (and other pieces of information).

The reason for the original design could have been done because:


The designer was unaware of RLS
The RDBMS did not support RLS
DBA Stack Exchange wasn't available to the developer at the time of implementation
The developer copy+pasted code unaware of the potential problems


constructing the SQL statements for contacts_201 screams "Possible SQL Injection"



The solution for (2) would be based on these words of wisdom:


  use the right tool for the job.


In other words, the RDBMS (that doesn't support RLS) should have been changed to an RDBS that supports the Business Requirement (ie one that does support RLS).  This could be a simple as doing an upgrade.

note "Database Agnostic Code is a Myth" could have been the major reason to not fix (2).