Les deux approches les plus courantes sont Table Per Class (c'est-à-dire une table pour la classe de base et une autre table pour chaque sous-classe qui contient les colonnes supplémentaires nécessaires pour décrire la sous-classe) et Table Per Hierarchy (c'est-à-dire toutes les colonnes d'une table, avec une ou plusieurs colonnes pour permettre la discrimination des sous-classes. La meilleure approche dépend vraiment des particularités de votre application et de la stratégie d'accès aux données.
Vous auriez Table Per Class dans votre premier exemple en inversant la direction du FK et en supprimant les identifiants supplémentaires du parent. Les deux autres sont essentiellement des variantes de table par classe.