We have arrived at the class design shown below(slightly simplified for purposes of this question) for people in a company, where:
1. Person is the base for all people types
2. A HeadcountPerson is a person who is deemed to be part of the company's population. We also have NonHeadcount people who are not part of a the company's population.
3. Headcount people include Employees and Contractors
4. An Assignee is a type of Employee
From a design viewpoint the inheritance seems to work well for the following reasons I can think of, there are probably more:
1. It will allow us to treat all the different people types as the same Person type when necessary
2. We can use polymorphism to deal with behaviour that is common to all Person types but needs to be
handled slightly differently in each child class
3. Each child class only encapsualtes behaviour and properties which is applicable to itslef, which makes using the class clear and simple
4. code reuse.
However in the past we have run into performance problems with inheritance. We use a layered approach when coding thus each of the classes above will belong to the business logic layer and each will have an associated data access class which will handle getting the data for each business logic layer class. This means for example that when we instantiate an instance of the Assignee class, the code will be going to the database 4 seperate times and running 4 seperate queries which results in a slow User response time especially when working with lists of objects.
I would appreciate any comments on the above design and in particular if there is a way to maintain the design without the performance problems

Thanks John