Je instinct om geen grote tafel met veel NULLS te maken, klopt. Dat is een slecht idee, zowel vanuit het oogpunt van opslag/ophalen/onderhoud als vanuit het oogpunt van gegevensvalidatie (daarover later meer).
De twee meest voorkomende benaderingen:
1) Zorg voor een gebruikerstabel met alle gemeenschappelijke velden erin, inclusief een "userType"-veld. Maak dan voor elk gebruikerstype een aparte tabel met de extra velden. Alle gebruikers hebben een rij in de gebruikerstabel en een of meer van de specifieke gebruikerstypetabellen. Dit is het meest genormaliseerd en het meest efficiënt voor opslag en snelle aanmeldingen. Hiermee kunt u ook beperkingen en externe sleutels gebruiken om ervoor te zorgen dat alle vereiste informatie voor elk gebruikerstype beschikbaar is.
2) Zorg voor een gebruikerstabel met alle gemeenschappelijke velden erin. Heb een andere tabel met de naam UserAttributes dat velden heeft voor gebruikers-ID, sleutel en waarde. Eventuele extra metadata voor een bepaalde gebruiker kunnen hier worden opgeslagen. Dit heeft het voordeel dat er geen databasebeheer nodig is om nieuwe gebruikerstypes of metadata toe te voegen die voor elk gebruikerstype moeten worden opgeslagen. U kunt er echter geen gegevensvalidatie op DB-niveau mee uitvoeren.