Auf die Gefahr hin, ein 'Architektur-Astronaut' hier zu sein, würde ich mehr geneigt sein, mit separaten Tabellen für die Unterklassen zu gehen. Lassen Sie den Primärschlüssel der Unterklassentabellen auch einen Fremdschlüssel sein, der mit dem Obertyp verknüpft ist.
Der Hauptgrund dafür ist, dass es dann viel logisch konsistenter wird und Sie nicht mit vielen Feldern enden, die für diesen bestimmten Datensatz NULL und unsinnig sind. Diese Methode macht es auch viel einfacher, den Untertypen zusätzliche Felder hinzuzufügen, wenn Sie Ihren Entwurfsprozess iterieren.
Dies fügt den Nachteil hinzu, JOINs zu Ihren Abfragen hinzuzufügen, was sich auf die Leistung auswirken kann, aber ich gehe fast immer zuerst mit einem idealen Design und dann später zur Optimierung, wenn es sich als notwendig erweist. Die wenigen Male, die ich den "optimalen" Weg gegangen bin, habe ich es fast immer später bereut.
Also mein Design etwas wie
PERSON (PersonID, Name, Adresse, Telefon, ...)
SPECIALPERSON (PersonID BEZUG PERSON (PersonID), zusätzliche Felder ...) wäre
USER (PersonID BEZUG PERSON (PersonID), Benutzername, encryptedpassword, zusätzliche Felder ...)
Sie auch VIEWs später, dass die aggregierte Supertyp und den Subtyp schaffen könnten, wenn dies erforderlich ist.
Der einzige Fehler in diesem Ansatz ist, wenn Sie stark nach Subtypen suchen, die mit einem bestimmten Supertyp verbunden sind. Es gibt keine einfache Antwort auf dieses Problem von oben, Sie könnten es bei Bedarf programmgesteuert verfolgen oder aber globale Abfragen ausführen und die Ergebnisse zwischenspeichern. Es hängt wirklich von der Anwendung ab.
Wenn du sagst: "Das ist schnell, aber verschwenderisch", meinst du schnell zu entwickeln oder leistungsmäßig schnell? – user3748908
Beide, alle Daten sind in einer Tabelle (im Gegensatz zu Option 3), so dass keine Joins so ziemlich schnell zu lesen und zu schreiben benötigt, und es ist einfach zu entwickeln. Die meisten OR-Mapper unterstützen solche Schemas. – Mendelt
Schnell im Vergleich zu Table-Per-Type (wegen der Joins), aber langsamer als Table-Per-Concrete, da die Tabellen in Table-Per-Concrete kleiner sind und man sie selten miteinander verbindet, richtig ? – user3748908