Évitez les "clés étrangères" pouvant être annulées. Ils présentent de multiples inconvénients.
La contrainte sur une ligne de référence n'est pas toujours appliquée lorsque la clé étrangère contient un null. Cependant, ce comportement par défaut n'est pas cohérent entre les différents SGBD. Certains SGBD prennent en charge les options de configuration pour modifier le comportement des clés étrangères annulables et d'autres non. Les développeurs et les utilisateurs SQL peuvent donc ne pas savoir ce que signifie réellement une contrainte de clé étrangère annulable du point de vue de l'intégrité des données. Le portage de la base de données entre les produits SGBD ou même entre différents serveurs utilisant le même produit peut donner des résultats incohérents.
Les outils de conception de base de données, les outils d'intégration et d'autres logiciels ne les prennent pas toujours correctement en charge et les résultats qu'ils produisent peuvent être erronés.
Les clés étrangères sont fréquemment utilisées dans les jointures et autres logiques de requête, aggravant les problèmes des utilisateurs qui pensent que la contrainte est en vigueur lorsqu'elle ne l'est pas ou qui ne connaissent pas la logique appliquée par votre SGBD particulier.
Certaines fonctionnalités d'optimisation de requête permettant des réécritures de requête et d'autres optimisations peuvent ne pas être disponibles lorsqu'une clé étrangère peut être annulée.
En termes logiques, une contrainte de "clé étrangère" nullable n'a pas beaucoup de sens logique. Selon la norme SQL, une telle contrainte ne peut pas être violée même si la table référencée est vide. Cela contredit l'une des justifications alléguées les plus courantes de l'utilisation d'un nul - qu'il s'agit du cas "inconnu". S'il n'y a pas de valeurs valides de X, tout X "inconnu" ne peut certainement pas être une valeur valide - et pourtant SQL le permettra.
Les clés étrangères nulles sont totalement inutiles. Vous pouvez toujours soit décomposer la clé étrangère dans une nouvelle table ou utiliser un modèle de supertype / sous-type afin que les valeurs nulles ne soient pas nécessaires. Dans un souci de simplicité et de précision, il vaut donc mieux laisser les valeurs nulles que de les insérer.