Twój instynkt, aby nie tworzyć dużego stołu z dużą ilością NULL, jest słuszny. To zły pomysł z punktu widzenia przechowywania/odzyskiwania/utrzymania, a także z punktu widzenia walidacji danych (więcej o tym później).
Dwa najpopularniejsze podejścia:
1) Miej tabelę użytkowników ze wszystkimi typowymi polami, w tym polem „userType”. Następnie przygotuj osobną tabelę dla każdego typu użytkownika zawierającą dodatkowe pola. Wszyscy użytkownicy mają wiersz w tabeli użytkowników i co najmniej jedną tabelę określonego typu użytkownika. Jest to najbardziej znormalizowany i najbardziej wydajny pod względem przechowywania i szybkiego logowania. Pozwala to również na użycie ograniczeń i kluczy obcych, aby zapewnić, że wszystkie wymagane informacje dla każdego typu użytkownika są dostępne.
2) Miej tabelę użytkownika zawierającą wszystkie wspólne pola. Przygotuj inną tabelę o nazwie UserAttributes który zawiera pola dla identyfikatora użytkownika, klucza i wartości. Tutaj można przechowywać wszelkie dodatkowe metadane dla konkretnego użytkownika. Ma to tę zaletę, że nie wymaga od administratora bazy danych dodawania nowych typów użytkowników lub metadanych, które mają być przechowywane dla każdego typu użytkownika. Jednak nie pozwala na walidację danych na poziomie bazy danych.