How to model multiple types of contacts?
It depends on the data associated with each entity, the semantics of the data and the queries that will be used for the data.

For example, if &ldquo;sender contact&rdquo; and &ldquo;recipient contact&rdquo; can be the same and have the same attributes, it would be best to keep them in a single table. If they are strictly different, keeping them in different tables might be better.

Similar with contact types: I would have a common table that holds contacts for all types so that this table can be the target of a foreign key constraint. If just a few attributes differ (e.g. &ldquo;phone number&rdquo; versus &ldquo;e-mail address&rdquo;) just have them all in the same table and add a check constraint that makes sure they are NOT NULL according to the type. If a lot of attributes differ, you can consider adding foreigb key references to type specific tables.

Try to compose the SQL statements that will be used with these tables most often. If they look natural and simple enough and can be supported with few additional indexes, you probably got it right.