Dina instinkter att inte skapa ett stort bord med massor av NULLS är rätt. Det är en dålig idé, ur lagring/återhämtning/underhållssynpunkt, såväl som datavalideringssynpunkt (mer om det senare).
De två vanligaste tillvägagångssätten:
1) Ha en användartabell med alla vanliga fält i den, inklusive ett "userType"-fält. Ha sedan en separat tabell för varje användartyp som innehåller de extra fälten. Alla användare har en rad i användartabellen och en eller flera av de specifika användartyptabellerna. Detta är den mest normaliserade och mest effektiva för lagring och snabba inloggningar. Detta låter dig också använda kontraints och främmande nycklar för att säkerställa att all nödvändig information för varje användartyp är tillgänglig.
2) Ha en användartabell med alla vanliga fält i den. Har en annan tabell som heter något i stil med UserAttributes som har fält för användar-id, nyckel och värde. Eventuell extra metadata för en viss användare kan lagras här. Detta har fördelen av att det inte krävs någon databasadministration för att lägga till nya användartyper eller metadata som ska lagras för varje användartyp. Det låter dig dock inte göra någon datavalidering på DB-nivå.