Best structure for a Person in PHP classes (and databse)
First Question: Don't let potential use-cases of your application drive how you model the data. As you experienced, this causes a lot of headache later on. 

Extracting the dob &amp; dod for performance reasons is premature in this case. It is absolutely ok to load data even when not sure if it will be required. Every (un-optimized) application has a percentage of data it doesn't load. That's fine until you really experience performance issues. And then this probably is not the bottle neck you are going to optimize first. Loading those two extra values goes almost for free .

If you have larger data-structures (e.g. huge object tress by relations), you can use the lazy-loading pattern for this (which is what many ORM do to avoid joins). This keeps your model intact but avoids loading too much data. Lazy-loading scalars probably is more expensive then just loading them in the first place.

Excursus: What you tried to do is to model two different roles of the same entity. This is a valid approach some times. Yet this doesn't say the information is not loaded, it's just limiting the available interface. To be able to use its full power, generic functions are required though. An example might look like: 

interface Person {
    // shared information
}

interface PersonName extends Person {
    // names
}

interface PersonDates extends Person {
    // dob &amp; dob
}

public find&lt;? extends Person&gt;(int id) {
    return PersonImpl();
}

class PersonImpl implements PersonName, PersonDates {
}

repository.find&lt;PersonName&gt;(1);
repository.find&lt;PersonDates&gt;(1);


This is some very expensive pattern though, in terms of complexity and effort to create. You'll rarely use this. Especially as this doesn't make data loading faster. The entity is always loaded completely too. 

Second Question: Well, you know my opinion here :). Separate your model from how it is stored. The repository (its mapper) should be the only one to know how to save the model to the database. 

Database structure: 


I prefer to to name tables in plural (as they represent collections). Other do as you. Some kind a personal, stick to one convention though. 
Use InnoDb's foreign keys in your model. They help greatly to enforce data integrity.
Normalization would require to extract city, postcode and county from your address table into a separate one.