Su instinto de no crear una gran mesa con muchos NULLS es correcto. Esa es una mala idea, desde el punto de vista del almacenamiento/recuperación/mantenimiento, así como desde el punto de vista de la validación de datos (más sobre esto más adelante).
Los dos enfoques más comunes:
1) Tenga una tabla de usuario con todos los campos comunes, incluido un campo "tipo de usuario". Luego tenga una tabla separada para cada tipo de usuario que contenga los campos adicionales. Todos los usuarios tienen una fila en la tabla de usuarios y una o más de las tablas de tipos de usuarios específicos. Este es el más normalizado y el más eficiente para el almacenamiento y los inicios de sesión rápidos. Esto también le permite usar restricciones y claves foráneas para garantizar que toda la información necesaria para cada tipo de usuario esté disponible.
2) Tener una tabla de usuario con todos los campos comunes en ella. Tener otra tabla llamada algo como UserAttributes que tiene campos para ID de usuario, clave y valor. Cualquier metadato adicional para un usuario en particular se puede almacenar aquí. Esto tiene la ventaja de que no requiere ninguna administración de base de datos para agregar nuevos tipos de usuarios o almacenar metadatos para cada tipo de usuario. Sin embargo, no le permite realizar ninguna validación de datos a nivel de base de datos.