La façon dont vous posez la question (et proposez deux alternatives), c'est comme si la seule préoccupation était que le driverId soit toujours valide au moment de la création de la voiture.
Cependant, vous devez également vous inquiéter du fait que le pilote associé à driverId ne soit pas supprimé avant que la voiture soit supprimée ou donnée à un autre pilote (et peut-être aussi que le pilote ne soit pas affecté à une autre voiture (ceci si le domaine restreint un pilote à seulement être associé à une voiture)).
Je suggère qu'au lieu de la validation, vous allouez (ce qui inclurait la validation de la présence). Vous interdirez alors les suppressions pendant qu'elles sont encore allouées, vous protégeant ainsi de la condition de concurrence des données périmées pendant la construction, ainsi que de l'autre problème à plus long terme. (Notez que l'allocation valide et marque à la fois l'allocation et fonctionne atomiquement.)
Btw, je suis d'accord avec @PriceJones que l'association entre la voiture et le conducteur est probablement une responsabilité distincte de la voiture ou du conducteur. Ce type d'association ne fera que croître en complexité au fil du temps, car cela ressemble à un problème de programmation (pilotes, voitures, créneaux horaires / fenêtres, substituts, etc.). Même s'il s'agit plutôt d'un problème d'enregistrement, on peut vouloir l'historique les enregistrements ainsi que les enregistrements en cours. Ainsi, il pourrait très bien mériter sa propre Colombie-Britannique.
Vous pouvez fournir un schéma d'allocation (tel qu'un nombre booléen ou de référence) au sein de la BC des entités agrégées allouées, ou au sein d'une BC distincte, disons, celle responsable de l'association entre voiture et conducteur. Si vous faites le premier, vous pouvez autoriser les opérations de suppression (valides) émises pour la voiture ou le conducteur BC; si vous faites ce dernier, vous devrez empêcher les suppressions des BC voiture et conducteur et les envoyer à la place via le planificateur d'association voiture et conducteur.
Vous pouvez également répartir certaines des responsabilités d'allocation entre les BC comme suit. La voiture et le conducteur BC fournissent chacun un schéma "d'allocation" qui valide et définit le booléen alloué avec ce BC; lorsque leur attribution booléenne est définie, le BC empêche la suppression des entités correspondantes. (Et le système est configuré de sorte que la voiture et le conducteur BC autorisent uniquement l'allocation et la désallocation à partir de la programmation de l'association voiture / conducteur BC.)
Le BC de planification des voitures et des chauffeurs tient ensuite à jour un calendrier des conducteurs associés à la voiture pour certaines périodes / durées, actuelles et futures, et notifie les autres BC de la désallocation uniquement lors de la dernière utilisation d'une voiture ou d'un conducteur programmé.
En tant que solution plus radicale, vous pouvez traiter les BC de voiture et de chauffeur comme des usines d'enregistrement historique uniquement en annexe, laissant la propriété au planificateur d'association de voiture et de conducteur. La voiture BC peut générer une nouvelle voiture, avec tous les détails de la voiture, ainsi que son VIN. La propriété de la voiture est gérée par le planificateur d'association voiture / conducteur. Même si une association voiture / conducteur est supprimée et que la voiture elle-même est détruite, les enregistrements de la voiture existent toujours dans la voiture BC par définition, et nous pouvons utiliser la voiture BC pour rechercher des données historiques; tandis que les associations / propriétaires de voitures / conducteurs (passées, présentes et potentiellement futures prévues) sont gérées par un autre pays bénéficiaire.
Driver.delete
ne devrait pas exister. Je n'ai jamais vraiment vu un domaine où les agrégats sont détruits. En gardant les RA autour de vous, vous ne pouvez jamais vous retrouver avec des orphelins.