In this case, when these profiles are really determined by the criteria of the real world, I would suggest using tables dedicated to each type. However, in the interest of full disclosure, you can use the EAV system to store them. Something similar to:
User: UserID ... ProfileID Profile: ProfileID Name Criteria: CriteriaID Name ProfileCriteria: ProfileID CriteriaID UserCriteria: UserID CriteriaID
The Profile table defines the parent table for profiles. You will have one line for each of your profile types.
Criteria defines the main criteria that can exist in a profile, no matter which profile (for example, you can have the same criteria for multiple profiles).
CriteriaProfile is used to create the m: m relationship between Profile and Criteria . It also means that you add things like sorting for criteria in a specific profile.
UserCriteria points to user values for the specified criteria. It will also allow you to switch profiles for the user and maintain any criteria that are common, simply by deleting those that were not part of the new profile.
HOWEVER
EAV structures have a lot of overhead to maintain. Instead of relying on RDBMS tools to manage structured data (for which people are paid a lot of money to come up with), now you need to manage it yourself. Tables tend to grow significantly faster than systems without EAV, since you have many times more rows (since now you have a row for each column in the normal structure).
EAVs are powerful and flexible, but not always the solution. If your profiles need to be dynamic, then they may be the right tool.
source share